引言
从cv转向nlp,大家一起来学习。
还没看nlp的学习路线,第一感觉就是先学一下RNN,LSTM,先把实际问题弄清楚。
个人认为nlp是处理时序性数据的,例如句子:I would like to arrive Taipei on November。我们想要知道这句话的语义信息,包括目的地,出发时间,出发地等。而除了Taipei、November之外,其他词在目前 看来是没有用的。所以这两个词为这句话的关注点。官方称为Slot Filling,槽填充 。槽,那些位置凹进去就代表我们需要的信息。
RNN
cv分类任务中,一张图片输进卷积神经网络,输出得到一维向量(概率分布)。概率最大的索引即为图片的类别。
现在我们试图将一句话的每个词逐个放入神经网络,让神经网络输出这个词属于哪个slot,即语义或类别。
数据处理:将每个词转换成向量,Vetor。这里使用Beyond 1-of-N encoding(one-hot类型),因为某些词不在字典里面(字典,我们需要预测的slot的集合),则它属于other属性。神经网络会输出该词的Probability distribution。(属于每个slot的可能性)。
问题出现
Taipei这个词什么时候属于出发地,什么时候属于目的地,网络并不能判别。对于神经网络input一样,output一样。而人类为什么能判别,是因为我们是通过上下文来推导。
方法 我们需要神经网络也结合上下文来推断某个词,所以我们要赋予神经网络记忆功能。使输入相同,而output不同。通过存储上一次运算的值来实现记忆功能。
举例,实际要看具体公式
虽然input:Taipei一样,由于store存储的值不同会造成绿色隐藏层差异,所以神经网络会通过前文来判断下一个词。具体怎么联系前文,这就是网络训练的事情了。
不同的RNN
cv中的域适应方向,Adversarial Discriminative Domain Adaptation论文中将两个网络的输出值输入到判别器,以此欺骗判别器。Y(输出值)是含有语义信息的,而中间的隐藏层只是特征。李宏毅说jordan network表现好一点。
LSTM
通常RNN都是使用LSTM的,Long Short-term Memory。short-term(短期):它只记得上一次的值。
第一感觉像电路,3个控制门信号,1个输入,1个输出。控制门用0或1控制,在激活函数中用sigmoid可以实现,代表控制门打开的程度。
- input gate Zi:是否使用input Z
- forget gate Zf:控制上一次记忆C的大小,C’将代替C。C’ = input + 上一次的记忆
- output gate Zo:是否输出output a,a = h(C’)f(Zo)
网络(重点来了 )
将LSTM cell代替普通的神经元
step1:input x1乘以不同的weights作为不同控制门的输入,所以神经元从输入层的一个神经元到隐藏层的一个神经元只需要一个weight,现在从输入层带一个LSTM cell需要4个weights。
step2:t代表时间序列(时间点),假设普通神经网络的某一层含有100个神经元,这里就有100个LSTM cell。
C
t
−
1
C^{t-1}
Ct−1 表示t-1时间点这一层所有memory cell的值,即一个向量,每一维的值表示一个LSTM cell的存储值。
Z
t
Z^{t}
Zt 通过
X
t
X^{t}
Xt的线性变换得到,向量的维度与cell的个数相同。
step3:两个时间点是如何连接呢?有下图可知,input发生变化。
X
t
+
1
X^{t+1}
Xt+1,
h
t
h^{t}
ht,
C
t
C^{t}
Ct拼接一起作为下一个时间点的输入。再转换层控制门向量Z。
此时只是输入层与第一层隐藏层的连接,后面还有很多层。
Keras
可选择LSTM、GRU、SimpleRNN的layer,就好比CNN的换一个卷积层,卷积层需要决定输出的通道数,对应于这里的LSTM cell的个数。
结束!视频长48分钟。