第四讲 Word Window 分类与神经网络
- 分类:正则化处理
正则化能够有效防止过拟合,当我们的特征较多时,很容易导致模型过拟合,或者引起指数爆炸,而正则化操作能够使得在某些具体的点拟合较差,但总体的拟合曲线更加平滑,并且泛化性能更好。 - 词窗口分类
词含义的定义:词的含义并不是单一定义的,无法在不结合上下文的状态下确定一个词的真正含义,因此,一个单词的真正含义取决于窗口内的上下文的词。
如何进行窗口分类:首先我们需要训练一个softmax分类器,给中心词分配一个标签,然后用一个窗口把它前后的单词连接起来,将窗口内的单词的词向量拼接放入softmax分类器,此时的表示分类的结果。此时我们的总体目标是对所有的分类概率求和, - 神经网络结构
x:一个窗口,即多个词向量的拼接
a:神经元激活向量,最终分类层的输入
分类器:softmax - 最大间隔损失函数
训练目标:让正确窗口的得分比错误窗口的得分更大,其差值最好定义为1 - 如何确保不陷入局部最优
不停的随机更新,使得它很难陷入局部最优,但事实上,你的窗口越小,你的随机性越大。
在很多情况下,局部最优解事实上非常接近你设想的全局最优解。
第五讲 反向传播和项目建议
- 两层神经网络和反向传播
这里的U代表的只是一个向量,假定最后通过向量内积得到的列向量即为我们想要的类别,然而在实际操作中,应该有许多非线性函数代替此处的U。
这里的x均为列向量。 - 数据集划分
数据集在划分时,训练集、验证集和测试集不应该有重叠。
具有时间特征的数据不应该随机采样,如果采用随机采样,在划分数据集时可能会有交叉。
第六讲 语法和依存分析
- 描述人类语言结构的方法
上下文无关文法:自定义一些规则,即一些成分文法。
依存句法结构:通过找到句子当中每一个词所依赖的部分来描述句子结构,如果一个词修饰另一个词,或者是另外一些词的一个论证,那么它就是那个词的依赖。通常用箭头表示它们之间的依存关系。 - 依存句法树的优点
可以被重复利用:而人类指定的语法规则有时候通常无法重用,每个人对语法规则有着自己的理解。
使用了真实的覆盖面广的数据。
能给出所有可能性及其各自的频率,也会给出不同可能性同时发生的频率。
可以用来评估构建的任何系统,以及各种工具的好坏。 - 依存关系表示
依存句法:有一个词法项之间的关系,或词之间的关系,只有词法项之间是二元的不对称关系,也就是我们在这些词法项之间画箭头,这些箭头则称为依存。 - 如何做依存句法分析
把句子中的每个词都提出来,然后判断这些词的独立项或者头部是什么。
通常有一些限制条件:首先需要选择一个词作为ROOT独立项,其次不希望有环的出现。
只要满足以上条件就可以生成一个依存树。
箭头通常画在句子上面,可以有交叉。
通过树不能恢复正确的词的有序性,也就是说词序无法通过依存树体现。 - 依存句法分析的方法
动态编程法
图算法(最小生成树算法)
约束补偿问题
确定型依存句法分析:在考虑每个词的依赖项时有点贪心,希望有一个机器学习的分类方法
第七讲 TensorFlow入门
- 什么是TensorFlow?
Big idea:将数值计算表示为计算图来执行,TensorFlow程序的主干都将是一个图,图的节点就是一个操作,每个节点都会有多个输入和一个输出,节点之间的边表示在它们之间流动的张量,张量就是一个n维的数组。
该图表示的是含有一个隐藏层的神经网络图结构,其中使用了ReLU作为激活函数。
图中的W和b是变量,变量是能够保存当前输出状态的节点,并且默认能够自动进行梯度更新,变量也是你想要微调,进行最小化损失的东西。
图中的x表示占位符(Placeholders),占位符是哪些在执行时间才会接收值的节点,如果网络需要依赖外部输入的值,则x就是我们的输入,我们在初始化时,不需要初始化值,只需分配一个数据类型,并且分配一种大小的张量。
数学操作节点,图中的MatMul表示矩阵乘法,ADD表示加法,ReLU表示激活函数。
图仅仅定义,通过get_operation()调用时,则生成了一整张Tensor图。 - 如何执行TensorFlow?
将其定义为一张图以后,我们将其部署到会话中,会话是与特定的执行上下文(CPU或GPU)的绑定。
sess.run(fetches,feeds)
Fetches是返回节点输出的图形节点列表,即h。
feeds是从图形节点到我们先要在模型中运行的实际值的字典映射,即x占位符的值。 - 如何优化TensorFlow?
我们将使用label和prediction建立一个损失节点。
计算梯度:在tensorflow中,我们使用minimize计算梯度,minimize实际上做了两件事:第一是计算参数的梯度,在这个例子中,参数为交叉熵,它和我们图中定义的所有变量相关,在这个例子中即为b和W,然后他会给这些变量根据梯度进行更新。 - 如何利用TensorFlow定义一个线性回归?
def linear_regression():
x = tf.placeholder(tf.float32, shape=(None,), name='x')
y = tf.placeholder(tf.float32, shape=(None,), name='y')
with tf.variable_scope('lreg') as scope:
w = tf.Variable(np.random.normal(), name='W')
y_pred = tf.mul(w, x)
loss = tf.reduce_mean(tf.square(y_pred - y))
return x, y, y_pred, loss
def run():
x_batch, y_batch = generate_dataset()
x, y, y_pred, loss = linear_regression()
optimizer = tf.train.GradientDecentOptimizer(0.1).minimize(loss)#优化器
init = tf.global_variables_initializer()
with tf.Session() as session:
session.run(init)
feed_dict = {x: x_batch, y: y_batch}
for _ in range(30):
loss_val, _ = session.run([loss, optimizer, feed_dict])
print('loss:', loss_val.mean())
y_pred_batch = session.run(y_pred, {x: x_batch})
- 如何利用TensorFlow实现一个word2vec(skip-gram)?
# 首先定义一些参数
batch_size = 128
vocabulary_size = 500000
embedding_size = 128
num_sampled = 64
# load_data
train_data, val_data, reverse_dictionary = load_data()
print("Number of training examples:", len(train_data)*batch_size)
print("Number of validation examples:", len(val_data))
def skipgram():
batch_inputs = tf.placeholder(tf.int32, shape=[batch_size,])
batch_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])
val_dataset = tf.constant(val_data, dtype=tf.int32)
with tf.variable_scope("word2vec") as scope:
embeddings = tf.Variable(tf.random_uniform([vocabulary_size,
embedding_size],
-1.0, 1.0))
batch_embeddings = tf.nn.embedding_lookup(embedding, batch_inputs)
weights = tf.Variable(tf.truncated_normal([vocabulary_size,
embedding_size]),
stddev = 1.0/math.sqrt(embedding_size)))
biases = tf.Variable(tf.zeros([vocabulary_size]))
loss = tf.reduce_mean(tf.nn.nce_loss(weights=weights,
biases=biases
labels=batch_labels,
inputs=batch_inputs,
num_sampled=num_sampled,
num_classes=vocabulary_size))
norm = tf.sqrt(tf.reduce_mean(tf.square(embeddings), 1, keep_dims=True))
normalized_embeddings = embeddings/norm
val_embeddings = tf.nn.embedding_lookup(normalized_embeddings, val_dataset)
similarity = tf.matmul(val_embeddings, normalized_embeddings, transpose_b=True)
return batch_inputs, batch_labels, normalized_embeddings, loss, similarity
def run():
batch_inputs, batch_labels, normalized_embeddings, loss, similarity= skipgram()
optimizer = tf.train.GradientDescentOptimizer(1.0).minimize(loss)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
average_loss = 0.0
for step, batch_data in enumerate(train_data):
inputs, labels = batch_data
feed_dict = {batch_inputs: inputs, batch_labels: labels}
_, loss_val = session.run([optimizer, loss], feed_dict)
average_loss += loss_val
if step % 1000 == 0:
if step > 0:
average_loss /= 1000
print('loss at iter', step, ":", average_loss)
average_loss = 0
if step % 5000 == 0:
sim = similarity.eval()
for i in xrange(len(val_data)):
top_k = 8
nearest = (-sim[i, :]).argsort()[1:top_k+1]
print_closest_words(val_data[i], nearest, reverse_dictionary)
final_embeddings = normalized_embedding.eval()
#let's training
final_embeddings = run()
来源:CSDN
作者:ccszbd
链接:https://blog.csdn.net/weixin_42864175/article/details/104139435