提交 6096f1a6 编写于 作者: SwordRed's avatar SwordRed

添加图片啊

还缺一张图片和文字第二次调整
上级 ff274946
......@@ -11,7 +11,7 @@
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="test.py" pinned="false" current-in-tab="true">
<file leaf-file-name="test.py" pinned="false" current-in-tab="false">
<entry file="file://E:/常用文件/OCR之word转换xml或json/工作文件/代码/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="19">
......@@ -23,12 +23,24 @@
</provider>
</entry>
</file>
<file leaf-file-name="Word Embeddings_Encoding Lexical Semantics.md" pinned="false" current-in-tab="false">
<file leaf-file-name="Word Embeddings_Encoding Lexical Semantics.md" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/docs/1.0/Word Embeddings_Encoding Lexical Semantics.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="285">
<caret line="126" column="11" selection-start-line="126" selection-start-column="5" selection-end-line="126" selection-end-column="11" />
<first_editor relative-caret-position="152">
<caret line="8" column="10" lean-forward="true" selection-start-line="8" selection-start-column="10" selection-end-line="8" selection-end-column="24" />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="blitz_autograd_tutorial.md" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/docs/1.0/blitz_autograd_tutorial.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="2565">
<caret line="177" column="20" lean-forward="true" selection-start-line="177" selection-start-column="20" selection-end-line="177" selection-end-column="20" />
</first_editor>
<second_editor />
</state>
......@@ -44,6 +56,11 @@
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>根据链式法则,雅可比向量积应</find>
</findStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
......@@ -53,11 +70,12 @@
<option value="E:/常用文件/OCR之word转换xml或json/工作文件/代码/aaa.py" />
<option value="E:/常用文件/OCR之word转换xml或json/工作文件/代码/error.txt" />
<option value="E:/常用文件/OCR之word转换xml或json/工作文件/代码/test.py" />
<option value="$PROJECT_DIR$/docs/1.0/blitz_autograd_tutorial.md" />
<option value="$PROJECT_DIR$/docs/1.0/Word Embeddings_Encoding Lexical Semantics.md" />
</list>
</option>
</component>
<component name="ProjectFrameBounds" extendedState="7">
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="281" />
<option name="y" value="-11" />
<option name="width" value="853" />
......@@ -68,6 +86,7 @@
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<expand>
......@@ -93,15 +112,10 @@
<item name="1.0" type="462c0819:PsiDirectoryNode" />
<item name="img" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pytorch-doc-zh" type="b2602c69:ProjectViewProjectNode" />
<item name="代码" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
......@@ -165,10 +179,10 @@
<servers />
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1696" height="1026" extended-state="7" />
<frame x="-8" y="-8" width="1696" height="1026" extended-state="6" />
<editor active="true" />
<layout>
<window_info content_ui="combo" id="Project" order="0" weight="0.22916667" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.2029762" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="bottom" id="Event Log" order="7" side_tool="true" />
<window_info anchor="bottom" id="Version Control" order="7" />
......@@ -196,6 +210,26 @@
</breakpoint-manager>
</component>
<component name="editorHistoryManager">
<entry file="file://E:/常用文件/OCR之word转换xml或json/工作文件/代码/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1767">
<caret line="93" column="20" selection-start-line="93" selection-start-column="20" selection-end-line="93" selection-end-column="20" />
<folding>
<element signature="e#0#25#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/docs/1.0/Word Embeddings_Encoding Lexical Semantics.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="3952">
<caret line="208" lean-forward="true" selection-start-line="208" selection-end-line="208" />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
<entry file="file://E:/常用文件/OCR之word转换xml或json/工作文件/代码/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1767">
......@@ -346,16 +380,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/docs/1.0/blitz_autograd_tutorial.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="19">
<caret line="1" lean-forward="true" selection-start-line="1" selection-end-line="1" />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/docs/1.0/aws_distributed_training_tutorial.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
......@@ -418,16 +442,6 @@
<entry file="file://E:/常用文件/OCR之word转换xml或json/工作文件/代码/error.txt">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/docs/1.0/Word Embeddings_Encoding Lexical Semantics.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="285">
<caret line="126" column="11" selection-start-line="126" selection-start-column="5" selection-end-line="126" selection-end-column="11" />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
<entry file="file://E:/常用文件/OCR之word转换xml或json/工作文件/代码/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="19">
......@@ -438,5 +452,28 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/docs/1.0/img/WordEmbeddings-74fcb594bdd93c0f956682ae1ea013e6.gif">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/docs/1.0/blitz_autograd_tutorial.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="2565">
<caret line="177" column="20" lean-forward="true" selection-start-line="177" selection-start-column="20" selection-end-line="177" selection-end-column="20" />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/docs/1.0/Word Embeddings_Encoding Lexical Semantics.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="152">
<caret line="8" column="10" lean-forward="true" selection-start-line="8" selection-start-column="10" selection-end-line="8" selection-end-column="24" />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
</component>
</project>
\ No newline at end of file
# 词嵌入:编码形式的词汇语义
词嵌入是一种由真实数字组成的稠密向量,每个向量都代表了单词表里的一个单词. 在自然语言处理中,总会遇到这样的情况:特征全是单词! 但是,如何在电脑上表述一个单词呢?你在电脑上存储的单词的ascii码,但是它仅仅代表单词怎么拼写,没有说明单词的内在含义(你也许能够从词缀中了解它的词性,或者从大小写中得到一些属性,但仅此而已). 更重要的是,你能把这些ascii码字符组合成什么含义?? 当V代表词汇表、输入数据是|V|维的情况下,我们往往想从神经网络中得到数据密集的结果,但是结果只有很少的几个维度(例如,预测的数据只有几个标签时)。我们如何从大的数据维度空间中得到稍小一点的维度空间?
> 译者:[巩子惠](https://github.com/sight007)
放弃使用ascii码字符的形式表示单词,换用one-hot encoding会怎么样了?好吧,W这个单词就能这样表示:
词嵌入是一种由真实数字组成的稠密向量,每个向量都代表了单词表里的一个单词。 在自然语言处理中,总会遇到这样的情况:特征全是单词!但是,如何在电脑上表述一个单词呢?你在电脑上存储的单词的`ascii`码,但是它仅仅代表单词怎么拼写,没有说明单词的内在含义(你也许能够从词缀中了解它的词性,或者从大小写中得到一些属性,但仅此而已)。 更重要的是,你能把这些`ascii`码字符组合成什么含义?当![](./img/WordEmbeddings-5206560a306a2e085a437fd258eb57ce.gif)代表词汇表、输入数据是![](./img/WordEmbeddings-74fcb594bdd93c0f956682ae1ea013e6.gif)维的情况下,我们往往想从神经网络中得到数据密集的结果,但是结果只有很少的几个维度(例如,预测的数据只有几个标签时)。我们如何从大的数据维度空间中得到稍小一点的维度空间?
cf775cf1814914c00f5bf7ada7de4369.gif
放弃使用`ascii`码字符的形式表示单词,换用`one-hot encoding`会怎么样了?好吧,![](./img/WordEmbeddings-f1290186a5d0b1ceab27f4e77c0c5d68.gif)这个单词就能这样表示:
其中,1就是表示w的独有位置,其他位置全是0。其他的词都类似,在另外不一样的位置有一个1代表它,其他位置也都是0。
![](./img/WordEmbeddings-cf775cf1814914c00f5bf7ada7de4369.gif)
其中,1 表示![](./img/WordEmbeddings-f1290186a5d0b1ceab27f4e77c0c5d68.gif)的独有位置,其他位置全是0。其他的词都类似,在另外不一样的位置有一个1代表它,其他位置也都是0。
这种表达除了占用巨大的空间外,还有个很大的缺陷。 它只是简单的把词看做一个单独个体,认为它们之间毫无联系。 我们真正想要的是能够表达单词之间一些相似的含义。为什么要这样做呢?来看下面的例子:
假如我们正在搭建一个语言模型,训练数据有下面一些句子:
......@@ -32,29 +34,21 @@ cf775cf1814914c00f5bf7ada7de4369.gif
如果每个属性都表示一个维度,那我们也许可以用一个向量表示一个单词,就像这样:
```py
\[ q_\text{mathematician} = \left[ \overbrace{2.3}^\text{can run}, \overbrace{9.4}^\text{likes coffee}, \overbrace{-5.5}^\text{majored in Physics}, \dots \right]\]
```
![](img/WordEmbeddings-62ca51f900bf27324a2be4e6b8609f4b.gif)
```py
\[ q_\text{physicist} = \left[ \overbrace{2.5}^\text{can run}, \overbrace{9.1}^\text{likes coffee}, \overbrace{6.4}^\text{majored in Physics}, \dots \right]\]
```
![](./img/WordEmbeddings-a0be0498fd8216177330deffbfcb6ea2.gif)
那么,我们就这可以通过下面的方法得到这些单词之间的相似性:
```py
\[\text{Similarity}(\text{physicist}, \text{mathematician}) = q_\text{physicist} \cdot q_\text{mathematician}\]
```
![](./img/WordEmbeddings-8b4e6bfa073defa91d3f23cdec8f1f0e.gif)
尽管通常情况下需要进行长度归一化:
```py
\[ \text{Similarity}(\text{physicist}, \text{mathematician}) = \frac{q_\text{physicist} \cdot q_\text{mathematician}} {\| q_\text{\physicist} \| \| q_\text{mathematician} \|} = \cos (\phi)\]
```
![](a./img/WordEmbeddings-8b4e6bfa073defa91d3f23cdec8f1f0e.gif)
Φ是两个向量的夹角。 这就意味着,完全相似的单词相似度为1。完全不相似的单词相似度为-1。
![](./img/WordEmbeddings-1ed346930917426bc46d41e22cc525ec.gif)是两个向量的夹角。 这就意味着,完全相似的单词相似度为1。完全不相似的单词相似度为-1。
你可以把本章开头介绍的one-hot稀疏向量看做是我们新定义向量的一种特殊形式,那里的单词相似度为0, 现在我们给每个单词一些独特的语义属性。 这些向量数据密集,也就是说它们数字通常都非零。
你可以把本章开头介绍的`one-hot`稀疏向量看做是我们新定义向量的一种特殊形式,那里的单词相似度为0, 现在我们给每个单词一些独特的语义属性。 这些向量数据密集,也就是说它们数字通常都非零。
但是新的这些向量存在一个严重的问题: 你可以想到数千种不同的语义属性,它们可能都与决定相似性有关,而且,到底如何设置不同属性的值呢?深度学习的中心思想是用神经网络来学习特征的表示,而不是程序员去设计它们。 所以为什么不把词嵌入只当做模型参数,而是通过训练来更新呢? 这就才是我们要确切做的事。我们将用神经网络做一些潜在语义属性,但是原则上,学习才是关键。 注意,词嵌入可能无法解释。就是说,尽管使用我们上面手动制作的向量,能够发现数学家和物理学家都喜欢喝咖啡的相似性, 如果我们允许神经网络来学习词嵌入,那么就会发现数学家和物理学家在第二维度有个较大的值,它所代表的含义很不清晰。 它们在一些潜在语义上是相似的,但是对我们来说无法解释。
......@@ -62,11 +56,11 @@ cf775cf1814914c00f5bf7ada7de4369.gif
## Pytorch中的词嵌入
在我们举例或练习之前,这里有一份关于如何在Pytorch和常见的深度学习中使用词嵌入的简要介绍。 与制作one-hot向量时对每个单词定义一个特殊的索引类似,当我们使用词向量时也需要为每个单词定义一个索引。这些索引将是查询表的关键点。意思就是,词嵌入被被存储在一个|V|*D的向量中,其中D是词嵌入的维度。词被被分配的索引i,表示在向量的第i行存储它的嵌入。在所有的代码中,从单词到索引的映射是一个叫'word_to_ix'的字典。
在我们举例或练习之前,这里有一份关于如何在`Pytorch`和常见的深度学习中使用词嵌入的简要介绍。 与制作`one-hot`向量时对每个单词定义一个特殊的索引类似,当我们使用词向量时也需要为每个单词定义一个索引。这些索引将是查询表的关键点。意思就是,词嵌入被被存储在一个![](./img/WordEmbeddings-2b13c62ff7b8f4c26887bf369a4e44c8.gif)的向量中,其中![](./img/WordEmbeddings-f623e75af30e62bbd73d6df5b50bb7b5.gif)是词嵌入的维度。词被被分配的索引`i`,表示在向量的第`i`行存储它的嵌入。在所有的代码中,从单词到索引的映射是一个叫`word_to_ix`的字典。
能使用词嵌入的模块是torch.nn.Embedding,这里面有两个参数:词汇表的大小和词嵌入的维度。
能使用词嵌入的模块是`torch.nn.Embedding`,这里面有两个参数:词汇表的大小和词嵌入的维度。
索引这张表时,你必须使用torch.LongTensor(因为索引是整数,不是浮点数)。
索引这张表时,你必须使用`torch.LongTensor`(因为索引是整数,不是浮点数)。
```py
# 作者: Robert Guthrie
......@@ -99,12 +93,11 @@ tensor([[ 0.6614, 0.2669, 0.0617, 0.6213, -0.4519]],
## 例子: N-Gram语言模型
回想一下,在n-gram语言模型中,给定一个单词序列向量w,我们要计算的是
```py
\[P(w_i | w_{i-1}, w_{i-2}, \dots, w_{i-n+1} )\]
```
回想一下,在`n-gram`语言模型中,给定一个单词序列向量![](./img/WordEmbeddings-f1290186a5d0b1ceab27f4e77c0c5d68.gif),我们要计算的是
wi是单词序列的第i个单词。
![](./img/WordEmbeddings-3c3d846fb2913b4605e8d59bc5a14e6c.gif)
![](./img/WordEmbeddings-aa38f107289d4d73d516190581397349.gif)是单词序列的第`i`个单词。
在本例中,我们将在训练样例上计算损失函数,并且用反向传播算法更新参数。
```py
CONTEXT_SIZE = 2
......@@ -192,20 +185,18 @@ print(losses) # 用训练数据每次迭代,损失函数都会下降。
## 练习:计算连续词袋模型的词向量
连续词袋模型(CBOW)在NLP深度学习中使用很频繁。它是一个模型,尝试通过目标词前后几个单词的文本,来预测目标词。这有别于语言模型,因为CBOW不是序列的,也不必是概率性的。 CBOW常用于快速地训练词向量,得到的嵌入用来初始化一些复杂模型的嵌入。通常情况下,这被称为预训练嵌入。 它几乎总能帮忙把模型性能提升几个百分点。
连续词袋模型(`CBOW`)在`NLP`深度学习中使用很频繁。它是一个模型,尝试通过目标词前后几个单词的文本,来预测目标词。这有别于语言模型,因为`CBOW`不是序列的,也不必是概率性的。 `CBOW`常用于快速地训练词向量,得到的嵌入用来初始化一些复杂模型的嵌入。通常情况下,这被称为`预训练嵌入`。 它几乎总能帮忙把模型性能提升几个百分点。
CBOW模型如下所示: 给定一个单词Wi,N代表两边的滑窗距,如Wi-1, .... ,Wi-N 和 Wi+1, ..... Wi+N,并将所有的上下文词统称为C,CBOW试图最小化
`CBOW`模型如下所示: 给定一个单词![](./img/WordEmbeddings-aa38f107289d4d73d516190581397349.gif) ,![](./img/WordEmbeddings-8d9c307cb7f3c4a32822a51922d1ceaa.gif)代表两边的滑窗距,如![](./img/WordEmbeddings-3f53ca9954dfc8730d4f58c937097118.gif)和![](./img/WordEmbeddings-3ff042e26bf4d74a5488884f76800e6c.gif),并将所有的上下文词统称为![](./img/WordEmbeddings-0d61f8370cad1d412f80b84d143e1257.gif)`CBOW`试图最小化
```py
\[-\log p(w_i | C) = -\log \text{Softmax}(A(\sum_{w \in C} q_w) + b)\]
```
![](./img/WordEmbeddings-56cc30cd24196bea5f078cb9b1f1d0dc.gif)
其中q_w是单词W的嵌入。
其中![](./img/WordEmbeddings-4856f4335c4b3d6613590c6d264e3541.gif)是单词![](./img/WordEmbeddings-f1290186a5d0b1ceab27f4e77c0c5d68.gif)的嵌入。
Pytorch中,通过填充下面的类来实现这个模型,有两条需要注意:
`Pytorch`中,通过填充下面的类来实现这个模型,有两条需要注意:
* 考虑下你需要定义哪些参数。
* 确保你知道每步操作后的结构,如果想重构,请使用.view()
* 确保你知道每步操作后的结构,如果想重构,请使用`.view()`
```py
CONTEXT_SIZE = 2 # 左右各两个词
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册