全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
688 0
2020-11-30
使用神经网络学习分布式单词表示形式:Octave中的从头实现
在本文中,将描述从头开始使用神经网络学习单词表示的问题。这个问题表现为在转让Coursera课程神经网络的机器学习,通过传授 杰弗里·辛顿教授 从多伦多大学在2012年。      
问题陈述
在本文中,我们将设计一个 神经网络语言模型。该模型将学习
预测  给定 前三个单词的 下一个单词。网络如下所示:
f1.png
提供的数据集由4克组成(4克是一个句子中4个相邻单词的序列)。这4克是从大量文本中提取的。  
4克被选择成使得所有的话涉案来自一个小
词汇 的250个字。请注意,出于此分配的目的,特殊字符(例如逗号,句号,括号等)也被视为单词。
词汇表中的250个单词中,很少有显示为下面的matlab / octave代码的输出。
加载data.mat
data.vocab
ans =
{
[1
[1
[1
[1
[1
[1
[1
[1
[1
[1
[1
[1
[1
[1
[1
[1
[1
[1
[1
[1


[1
[1
[1
[1
[1
}
该训练组由372550  4克。的 验证和测试集具有46568 4克的每种。        
让我们先看一下原始句子文件,该文件的前几行如下所示。它包含了原句从这些4克被提取。可以看出,我们在这里处理的句子非常简单。      
原始句子文件: 前几行
不,他现在说。
他做了什么?
钱在那里。
那不到一年前。
但是他只取得了第一个。
他们还有时间做。
但是他不应该拥有。
他们必须降服于人民。
我不知道那是哪里。
不,我不会。
会是谁?
不,我不是那个。
你可以做一个他们现在在哪里?
我知道没有像这样的地方。
现在就在这里,依此类推。
不是你还是他,都是你们两个。
所以这不会妨碍我。
该走了,该走了。
没有人会为我们做任何事情。
好吧,我想要更多。
他们会做到吗?
谁上学或不上学?
但是,它将获得相同的效果。
我们都有。
从该原始文本中提取的训练数据是372550 X 4的矩阵。这意味着有372550个训练案例,每个训练案例有4个单词(对应于每个4克)。
每个条目都是一个整数,它是词汇表中单词的索引。因此,每一行代表4个单词的序列。以下八度/ matlab代码显示了训练数据集的外观。  
1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18岁
19
load data.mat
[train_x
% 3-gram features for a training data-tuple
train_x(:
%ans =
%46
%58
%32
data.vocab{train_x(:
%ans = now
%ans = where
%ans = do
% target for the same data tuple from training dataset
train_t(:
%ans = 91
data.vocab{train_t(:
%ans = we
验证和测试数据也相似。他们每个包含46
在开始训练之前,需要将所有三个都分为输入和目标,并且需要将训练集分为多个小批。
需要加载数据,然后将其分为输入和目标。此后,将为训练集创建大小为100的迷你批次。
首先,我们需要训练一个历时的模型(使用正向传播一次通过训练集)。一旦实施,交叉熵损失将开始减少。
在这一点上,我们可以尝试更改超参数(历元数,隐藏单位数,学习率,动量等),以查看对训练和验证交叉熵有什么影响。
训练方法将输出一个“模型”(权重矩阵,网络中每一层的偏差)。
网络说明
f1
如上所示,网络由输入层,嵌入层,隐藏层和输出层组成。
输入层由三个单词索引组成。相同的'word_embedding_weights'用于将每个索引映射到分布式特征表示。这些映射的要素构成了嵌入层。  
该层连接到隐藏层,而隐藏层又连接到输出层。
输出层是250个字以上的softmax。  
训练包括两个步骤:(1) 前向传播: 计算(预测)词汇中单词的输出概率,作为输入3克的下一个单词。(2)反向传播:通过隐藏层将预测误差从输出层传播到输入层。
正向传播
的 正向传播 是相当直接,且如图所示在下面的代码可以执行:
1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18岁
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65岁
66
67
68
69
70
71
72
function [embedding_layer_state
fprop(input_batch
hid_to_output_weights
% This method forward propagates through a neural network.
% Inputs:
% input_batch: The input data as a matrix of size numwords X batchsize where
% numwords is the number of words
% So
% index k of the vocabulary.
%
% word_embedding_weights: Word embedding as a matrix of size
% vocab_size X numhid1
% numhid1 is the dimensionality of the embedding space.
%
% embed_to_hid_weights: Weights between the word embedding layer and hidden
% layer as a matrix of soze numhid1*numwords X numhid2
% number of hidden units.
%
% hid_to_output_weights: Weights between the hidden layer and output softmax
% unit as a matrix of size numhid2 X vocab_size
%
% hid_bias: Bias of the hidden layer as a matrix of size numhid2 X 1.
%
% output_bias: Bias of the output layer as a matrix of size vocab_size X 1.
%
% Outputs:
% embedding_layer_state: State of units in the embedding layer as a matrix of
% size numhid1*numwords X batchsize
%
% hidden_layer_state: State of units in the hidden layer as a matrix of size
% numhid2 X batchsize
%
% output_layer_state: State of units in the output layer as a matrix of size
% vocab_size X batchsize
%
[numwords
[vocab_size
numhid2 = size(embed_to_hid_weights
%% COMPUTE STATE OF WORD EMBEDDING LAYER.
% Look up the inputs word indices in the word_embedding_weights matrix.
embedding_layer_state = reshape(...
word_embedding_weights(reshape(input_batch
numhid1 * numwords
%% COMPUTE STATE OF HIDDEN LAYER.
% Compute inputs to hidden units.
inputs_to_hidden_units = embed_to_hid_weights' * embedding_layer_state + ...
repmat(hid_bias
% Apply logistic activation function.
hidden_layer_state = 1 ./ (1 + exp(-inputs_to_hidden_units)); %zeros(numhid2
%% COMPUTE STATE OF OUTPUT LAYER.
% Compute inputs to softmax.
inputs_to_softmax = hid_to_output_weights' * hidden_layer_state + repmat(output_bias
% Subtract maximum.
% Remember that adding or subtracting the same constant from each input to a
% softmax unit does not affect the outputs. Here we are subtracting maximum to
% make all inputs <= 0. This prevents overflows when computing their
% exponents.
inputs_to_softmax = inputs_to_softmax...
- repmat(max(inputs_to_softmax)
% Compute exp.
output_layer_state = exp(inputs_to_softmax);
% Normalize to get probability distribution.
output_layer_state = output_layer_state ./ repmat(...
sum(output_layer_state
反向传播
在反向传播更加复杂。对于三层网络,反向传播的数学公式如下所示。  
backprop_softmax.png
在模型训练时,它会打印出一些数字,以表明训练进行得如何。
该模型显示了在训练集上获得的平均每个案例的交叉熵(CE)。每100个迷你批计算一次平均CE。在每个时期结束时,报告整个训练集的平均CE。
每进行1000次小批量训练后,将在验证集上运行模型。回想一下,验证集由不用于训练的数据组成。它用于查看模型在看不见的数据上的表现。报告验证集上的交叉熵。
验证误差预计会随着时期的增加而减少,直到模型开始与训练数据过度拟合为止。因此,当验证误差开始增加时,训练立即停止,以防止 过度拟合。
训练结束时,将同时在验证集和测试集上运行模型,并报告两者的交叉熵。
一些应用
1.预测下一个词
训练完模型后,在给定3个先前单词的情况下,可以使用该模型为下一单词产生一些预测。
下一个示例显示了当模型被赋予3克“寿命”,“中”,“新”作为输入并要求预测下一个单词时,它预测单词“约克”最有可能成为最高单词(约0.94)的概率以及诸如“年”,“生命”和“世界”之类的概率较低的单词。  
它还显示了如何使用前向传播来计算预测:给定3-gram的下一个单词的分布。首先将单词投影到嵌入空间中,展平,然后权重矩阵顺序相乘,然后应用softmax函数计算每个单词成为3克之后的下一个单词的可能性。     
fp
2.生成风格化的伪随机文本
以下是生成一段伪随机文本的步骤:
从3个单词开始,用这3个单词初始化文本。
接下来,要求模型将k个最可能的单词作为最后三个单词之后的候选单词进行预测。
选择随机预测的最可能单词之一,并将其??插入文本的末尾。
重复步骤2-3以生成更多单词,否则停止。
这是默认情况下为每个3克滑动窗口生成前3个预测并随机选择其中一个预测单词的代码:
1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function gen_rand_text(words
probs = [];
i = 4;
while (i < 20 || word != '.')
[word
probs = [probs; prob];
i = i + 1;
end
fprintf(1
fprintf(1
fprintf(1
fprintf(1
end
从单词“我要去”开始,以下是使用该模型生成的一些文本:
f3.png
从“新生活”开始,以下是使用该模型生成的一段文本:
f4.png
3.查找最近的单词
所述字嵌入权重矩阵可以被用来表示在一个字嵌入空间,然后从每一个其它单词在单词表中的距离在这个词表示空间被计算。然后返回最接近的单词。   
从下面的动画示例可以看出,在语义上更接近的单词大多被选择为给定单词的最近单词。而且,时期的数量越多,就语义相似性而言,单词的排序越好。   
例如,单词“ between”之间最接近的语义相似单词(即,距离最小)是单词“之中”,而“ day”最接近的单词是“ year”和“ week”。同样,单词“和”比单词“或”更接近单词“但是”。            
之间能够游戏他的生活小人钱新办公室学校二
day.gif
4.使用t-SNE进行二维可视化
在所有上述实施例中,尺寸的的字嵌入空间是50。使用 t-SNE图 (Laurens van der Maaten嵌入t分布的随机最近邻),可以通过将(表示的)更近的词保持在分布表示空间中的更近的词在投影空间中,将单词投影到二维空间并可视化。     
从下图中可以看出,语义上接近的单词(用椭圆突出显示)在可视化中彼此靠近,因为在分布式表示空间中它们彼此靠近。
同样,下一个动画将可视化每个单词的邻域如何随着训练时期而变化(该模型最多可训练10个时期)。
img_5_3700img_99_3700tsne
5.解决词义问题
带有分布式表示:在这种类型的问题中,给出了词汇中的2个单词(w1,w2),其中第一个与第二个具有某种语义关系。现在,给出第三单词(来自词汇表的w3),并且将从单词表中找到与第三单词具有相似语义关系的第四单词。  
下图显示了 单词类比问题 和可能的解决方案,其中使用穷举搜索在嵌入空间中查找一个单词(与第三个单词)的距离最接近表示空间中第一个单词和第二个单词之间的距离。   
f2.png
下一个代码显示了一些单词解剖示例问题的结果以及使用分布式表示空间找到的解决方案。可以看出,尽管事实是数据集非常小,并且词汇表中只有250个单词,但是该算法很好地找到了所示示例的答案。
1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18岁
19
analogy('year'
%year:years::day:days
%dist_E('year'
analogy('on'
%on:off::new:old
%dist_E('on'
analogy('use'
%use:used::do:did
%dist_E('use'
analogy('he'
%he:his::they:their
%dist_E('he'
analogy('today'
%today:yesterday::now:then
%dist_E('today'
选型
Now the model is trained 4 times by changing the values of the hyper-parametersd (dimension of the representation space) and h (the number of nodes in the hidden layer)
The following figures show the cross-entropy errors on the training and validationsets for the models.As can be seen from the following figures
所述至少验证错误对于d = 32和h = 256的模型获得(也至少训练误差),所以这是最好的模型。  
training_CE
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群