趁着周末隔离在家,有时间就梳理一下深度学习的这些基础知识。纯属造轮子方便自己理解,可能对正在学习的小伙伴们也会有一点帮助吧。
应该会整理成几篇文章,最后要说的是的bert和xlnet。
RNN:循环神经网络
这里并不准备介绍RNN的基础定义,具体可以看维基百科上的定义:https://zh.wikipedia.org/wiki/%E5%BE%AA%E7%8E%AF%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C 。
相对于传统的词袋模型,RNN能更好考虑语序所带来的不同影响,基本结构如下:

如上图,输入x1到x4,对应输出y1到y4。这个图虽然简单,不过并不能体现RNN循环的特点,看下图:

网上也有很多方便理解的图,只是觉得不够好,还是自己重新画一下。x是输入,y是输出,h是中间隐状态,加号圆圈是作用函数(线性)。简单理解可以如下:
h1 = f1(x1, h0)
y1 = g(h1)
h2 = f1(x2, h1)
y2 = g(h2)
# 以此类推每个不同的输入x,都对应一个不同的激活函数f,而输出的函数g则是共享的。看到了,后一个隐状态是依赖于前一个隐状态的,所以叫循环。(也正是因为循环的存在,也导致了该结构效率不高,很难进行分布式计算)
上面是最基础的RNN,适合处理的任务,如序列标注等,每一个输入都有对应的输出的场景。RNN还有几种变种:
N vs 1
对于有些任务,如文本分类,输入很多,但是输出只有一个值,其变种结构如下:

和前面结构基本一样,只是输出的时候,只在最后的隐状态上输出。
1 vs N
同样,也有1对多的场景,例如从图像生成文本等。其结构可能有两种:
第一种:

第二种:

也很简单,一种是只输入一次,另一种是将输入变量复制成多个,分别进行输入。
N vs M
如果说前面两种变体理解起来都很简单,那这种就需要花点时间了。而且其使用场景还是非常多的,例如生成摘要等。
N vs M结构看起来应该是N vs 1和1 vs M的合体,就像矩阵分解。实际上,N vs M其实有点像这两种的合体:

如上图,4个输入对应3个输出,中间的c是语义编码,理解为中间输出其实就可以了,而Encoder和Decoder其实都可以理解为一个简单的N vs 1和1 vs N模型。完整结构如下:

跟1 vs N变种中的类似,也有另一种结构:

这种结构看起来挺复杂,可看图理解起来并不复杂,如上。
这种Encoder-Decoder结构,其实就是Seq2Seq了,至于中间的语义编码C,最简单的就是直接将Encoder中的最后的隐变量赋值给它,复杂一点的,可以对应Encoder中的隐变量做一次运算,结果赋值给C。
下一篇应该会讲Attention。