Add. Negative-sampling of NLP

pull/2/head
benjas 4 years ago
parent 856140ea1c
commit 3f9cf68781

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

@ -70,7 +70,7 @@ RNN的问题在于每一次的h只考虑前一个当h到最后的时候
#### 训练数据构建
输入数据从哪来首先我们得理解的是文字单词转换成数值它并不是仅仅针对该次任务或者该数据的Thou或者shalt在这里是有这些意思转成对应的数值在其它文本其它数据中也是同样的意思所以只要是符合逻辑的文本我们都可以拿来训练。目前有Google的预训练bert模型也是这个原理。一般我们会维护一下库大表。
输入数据从哪来首先我们得理解的是文字单词转换成数值它并不是仅仅针对该次任务或者该数据的Thou或者shalt在这里是有这些意思转成对应的数值在其它文本其它数据中也是同样的意思所以只要是符合逻辑的文本我们都可以拿来训练。目前有Google的预训练bert模型也是这个原理。一般我们会维护一下语料库大表。
![1609548160973](assets/1609548160973.png)
@ -100,4 +100,55 @@ Skipgram根据中间内容预测上下文
![1609548965958](assets/1609548965958.png)
> 这两个模型都存在gensim里后续调用该工具包即可。
> 这两个模型都存在gensim里后续调用该工具包即可。
最终预测的词也会带有概率而前面我们讲到如SoftMax用到会将最大的值提取出来如果我们的语料库非常大比如5万字那么要给出5万字的概率而SoftMax也得计算这5万可以说是非常耗时的怎么解决这个问题呢
#### 负采样方案
**初始方案:**
输入两个单词,看它们是不是前后对应的输入和输出,也就相当于一个二分类任务
![1609549331116](assets/1609549331116.png)
出发点是好的但是此时训练集构建出来的标签全为1无法进行较好的训练
![1609549488755](assets/1609549488755.png)
> 如上图这样相当于告诉模型只要往1预测那么一定能效果好类似风控场景中正负样本非常悬殊甚至达到11万的情况。我们是不能直接训练的我们会“构造”一些正样本而这里是1太多需要构建一些负样本。
**改进方案:**
加入一些负样本
![1609549655385](assets/1609549655385.png)
> 1个1添加多少个0呢gensim工具包给出的默认参数是1个1和5个0即正负样本比1:5
正常情况下的Skipgram训练集
![1609549825425](assets/1609549825425.png)
**大致流程如下:**
**1.初始化词向量矩阵**
![1609549880269](assets/1609549880269.png)
> 最左边Embedding是语料库大表所有的词都在里面。
>
> Context是本次的预测的文本
>
> dataset是负采样完成后的结果
![1609550018745](assets/1609550018745.png)
**2.通过神经网络返回传播来计算更新此时不光更新权重参数矩阵W也会更新输入数据**
![1609550107070](assets/1609550107070.png)
> 给出损失函数Error的结果并更新到输入和输出数据中。更新输出数据是为了输出本次的预测结果而更新输入数据是为了维护我们将一直使用的语料库大表使得我们的语料库的词向量等越来越准确。

Loading…
Cancel
Save