TensorFlow深度学习笔记 文本与序列的深度模型

wmhf6883 7年前
   <h2>Deep Models for Text and Sequence</h2>    <h2>Rare Event</h2>    <p>与其他机器学习不同,在文本分析里,陌生的东西(rare event)往往是最重要的,而最常见的东西往往是最不重要的。</p>    <h2>语法多义性</h2>    <ul>     <li>一个东西可能有多个名字,对这种related文本能够做参数共享是最好的</li>     <li>需要识别单词,还要识别其关系,就需要过量label数据</li>    </ul>    <h2>无监督学习</h2>    <ul>     <li>不用label进行训练,训练文本是非常多的,关键是要找到训练的内容</li>     <li>遵循这样一个思想:相似的词汇出现在相似的场景中</li>     <li>不需要知道一个词真实的含义,词的含义由它所处的历史环境决定</li>    </ul>    <h2>Embeddings</h2>    <ul>     <li>将单词映射到一个向量(Word2Vec),越相似的单词的向量会越接近</li>     <li>新的词可以由语境得到共享参数</li>    </ul>    <h2>Word2Vec</h2>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/4ca3f2c9333e9ed847e622d76d70797d.png"></p>    <ul>     <li>将每个词映射到一个Vector列表(就是一个Embeddings)里,一开始随机,用这个Embedding进行预测</li>     <li>Context即Vector列表里的邻居</li>     <li>目标是让Window里相近的词放在相邻的位置,即预测一个词的邻居</li>     <li>用来预测这些相邻位置单词的模型只是一个Logistics Regression, just a simple Linear model <h3>Comparing embeddings</h3> </li>     <li>比较两个vector之间的夹角大小来判断接近程度,用cos值而非L2计算,因为vector的长度和分类是不相关的:</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/d2847f4b09791bf56a654d86d9b26ffd.png"></p>    <ul>     <li>最好将要计算的vector都归一化</li>    </ul>    <h3>Predict Words</h3>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/8a999127728515bda657029c3705d5a8.png"></p>    <ul>     <li>单词经过embedding变成一个vector</li>     <li>然后输入一个WX+b,做一个线性模型</li>     <li>输出的label概率为输入文本中的词汇</li>     <li>问题在于WX+b输出时,label太多了,计算这种softmax很低效</li>     <li>解决方法是,筛掉不可能是目标的label,只计算某个label在某个局部的概率,sample softmax</li>    </ul>    <h2>t-SNE</h2>    <ul>     <li>查看某个词在embedding里的最近邻居可以看到单词间的语义接近关系</li>     <li>将vector构成的空间降维,可以更高效地查找最近单词,但降维过程中要保持邻居关系(原来接近的降维后还要接近)</li>     <li>t-SNE就是这样一种有效的方法</li>    </ul>    <h2>类比</h2>    <ul>     <li>实际上我们能得到的不仅是单词的邻接关系,由于将单词向量化,可以对单词进行计算</li>     <li>可以通过计算进行语义加减,语法加减</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/d8b74516c200a346328e536d64fbfc1d.png"></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/67bf8b0e4ce3dee5378b23025e097d34.png"></p>    <h2>Sequence</h2>    <p>文本(Text)是单词(word)的序列,一个关键特点是长度可变,就不能直接变为vector</p>    <h3>CNN and RNN</h3>    <p>CNN 在空间上共享参数,RNN在时间上(顺序上)共享参数</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/15f700a24714c3ec9dd1fb0ff31dbdeb.png"></p>    <ul>     <li>在每轮训练中,需要判断至今为之发生了什么,过去输入的所有数据都对当下的分类造成影响</li>     <li>一种思路是记忆之前的分类器的状态,在这个基础上训练新的分类器,从而结合历史影响</li>     <li>这样需要大量历史分类器</li>     <li>重用分类器,只用一个分类器总结状态,其他分类器接受对应时间的训练,然后传递状态</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/44b51369b1058ad946c706c0a840488d.png"></p>    <h3>RNN Derivatives</h3>    <ul>     <li>BackPropagation Through time</li>     <li>对同一个weight参数,会有许多求导操作同时更新之</li>     <li>对SGD不友好,因为SGD是用许多不相关的求导更新参数,以保证训练的稳定性</li>     <li>由于梯度之间的相关性,导致梯度爆炸或者梯度消失</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/40e4ac696ee7ea21610847d6aef695db.png"></p>    <ul>     <li>使得训练时找不到优化方向,训练失败</li>    </ul>    <p>Clip Gradient</p>    <p>计算到梯度爆炸的时候,使用一个比值来代替△W(梯度是回流计算的,横坐标从右往左看)</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/1804a92a5f6c4faa7f64c1e134955eaf.png"></p>    <ul>     <li>Hack but cheap and effective</li>    </ul>    <p>LSTM(Long Short-Term Memory)</p>    <p>梯度消失会导致分类器只对最近的消息的变化有反应,淡化以前训练的参数,也不能用比值的方法来解决</p>    <ul>     <li>一个RNN的model包含两个输入,一个是过去状态,一个是新的数据,两个输出,一个是预测,一个是将来状态</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/02b2bcae3c562ac8819b31d1459217e7.png"></p>    <ul>     <li>中间是一个简单的神经网络</li>     <li>将中间的部分换成LSTM-cell就能解决梯度消失问题</li>     <li>我们的目的是提高RNN的记忆能力</li>     <li>Memory Cell</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/f9a941c516fca8ee7e6bb914958a57f2.png"></p>    <p>三个门,决定是否写/读/遗忘/写回</p>    <ul>     <li>在每个门上,不单纯做yes/no的判断,而是使用一个权重,决定对输入的接收程度</li>     <li>这个权重是一个连续的函数,可以求导,也就可以进行训练,这是LSTM的核心</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/cd87603e39fe5df07f48dbb6952f4ebf.png"></p>    <ul>     <li>用一个逻辑回归训练这些门,在输出进行归一化</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/a83d2afce4ecf98708ba41be043d25e3.png"></p>    <ul>     <li>这样的模型能让整个cell更好地记忆与遗忘</li>     <li>由于整个模型都是线性的,所以可以方便地求导和训练</li>    </ul>    <p>LSTM Regularization</p>    <ul>     <li>L2, works</li>     <li>Dropout on the input or output of data, works</li>    </ul>    <h3>Beam Search</h3>    <p>有了上面的模型之后,我们可以根据上文来推测下文,甚至创造下文,预测,筛选最大概率的词,喂回,继续预测……</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/01853bce3406befb27835e83ad598c68.png"></p>    <ul>     <li>我们可以每次只预测一个字母,but this is greedy,每次都挑最好的那个</li>     <li>也可以每次多预测几步,然后挑整体概率较高的那个,以减少偶然因素的影响</li>     <li>但这样需要生成的sequence会指数增长</li>     <li>因此我们在多预测几步的时候,只为概率比较高的几个候选项做预测,that's beam search.</li>    </ul>    <h2>翻译与识图</h2>    <ul>     <li> <p>RNN将variable length sequence问题变成了fixed length vector问题,同时因为实际上我们能利用vector进行预测,我们也可以将vector变成sequence</p> </li>     <li> <p>我们可以利用这一点,输入一个序列,到一个RNN里,将输出输入到另一个逆RNN序列,形成另一种序列,比如,语言翻译</p> </li>     <li>如果我们将CNN的输出接到一个RNN,就可以做一种识图系统</li>    </ul>    <h2> </h2>    <p> </p>    <p>来自:http://www.jianshu.com/p/ba79aea19c95</p>    <p> </p>