Auto-encoder属于无监督学习,上几句名言:
可以看出,无监督学习不仅有很大的发展空间,还有巨大的好处。
Auto-encoder可以看做先用PCA得到code,然后再解回原来的内容。input通常会先做normalization,然后通过encoder得到code,中间的bottleneck layer的neural个数,就是code的dimension数,输出即是code。然后再解回原来的大小,与原数据比较差异,最小化差异。encoder与decoder并不必要是对称的。
还可以先增加噪声,然后将输出与原照片对比,获得具有去噪声能力的auto-encoder。
可以做文本检索,encode后,相近的意味着文本相关。类似的还有相似图片搜索,当然可以利用convolution
Unpooling可以简单地重复值,或者记住位置,其余补零。
灰色的代表补零,同时weight顺序颠倒。
pre-training的那一层相当于auto-encoder。hidden layer的neural大于input的dimension时,要加很强的regularization,比如L1。
就这么一层层train下去
最后输出层的参数w4随机初始化,再用backpropagation微调就行。pre-training可以用unlabel data,解决label data较少的问题。
希望decoder可以单独拿出来,然后单独生成。
exp(σ(sigma))是variance of noise,学出来的。e是从正态分布中generate出来的。
noise使得一些data的code会有重叠,因此当你输入code,其可能是某几个data加噪声后的code,所以结果会比较好。σ接近0,variance接近1。后面是L2 regularization。正式的解释就需要自行搜索了。
VAE may just memorize the existing images, instead of generating new images
仅仅是模仿,而不是真的试图以假乱真,因为虽然都是一个pixel的差异,但整个图片完全不一样。
类似自然界的共同进化。generator没有看过真正的image
Generator + Discriminator = a network
目前的问题就是不知道discriminator能力强不强,有可能骗过它只是因为它很弱。得保证两者共同进步。
RNN即Recurrent Neural Network,具有memory,即hidden layer的值,每个input除了sequence里的值外还包括memory,实现sequence to sequence的learning。其中比较standard的是LSTM。
Changing the sequence order will change the output.
均是同一个RNN,只是将sequence里的各项挨个输入
Elman network就是最一般的RNN,wh是hidden layer的值,每输入一个input,会读取上一个input的hidden layer的值。Jordan network是将output存起来。传说Jordan network的表现会更好(明星加成:)),因为y是有target的
上下文都看过,应该会更好
较长的短期记忆,因为不再是下一个input进来,memory就会更改
用一般的RNN,随机初始化激活函数用sigmoid,用identity matrix初始化用relu,吊打lstm
RNN不只可以做length相同的seq2seq,还有Many to one(情感分析、关键项提取)、Many to Many (Output is shorter)(语音识别,CTC引入了blank(该帧没有预测值),每个预测的分类对应的一整段语音中的一个spike(尖峰),其他不是尖峰的位置认为是blank。对于一段语音,CTC最后的输出是spike(尖峰)的序列,并不关心每一个音素持续了多长时间。)、Many to Many (No Limitation)(机器翻译)、Beyond Sequence(句法分析)、Auto-encoder (chat-bot、Video Caption Generation、Image Caption Generation)
deep learning与structured learning结合起来会有很好的效果。
纯粹就是给一个起始符,然后能生成一个sequence,可以是句子,也可以是图片。生成图片的话又称pixelRNN,用于给出图片的部分,看RNN如何补全。
Generate sentences based on conditions。一般就是将condition作为起始符输入
但是有时候我们不能单纯使用输入,比如聊天我们还会看之前的记录
生活大爆炸中不停说重复的例子,YouTube
所以有时还要将history作为condition
把一个sequence压成一个vector比较困难,而且可能会损失一些信息,我们可以增加attention。
h是RNN的output,z是一个vector,z0可以作为network参数的一部分,然后learn出来,match函数自己设计。
match输出的α通过softmax归一化,得到attention weight,然后通过上图右下角的公式算出c,将c作为与上一次的输出结果作为decoder RNN的input,z可能是input,老师在视频里没明确说。输出下一个z和结果。
一文读懂Attention:Facebook曾拿CNN秒杀谷歌,现如今谷歌拿它秒杀所有人
attention-based model还有Neural Turing Machine
输入一堆坐标,找到一个圈,可以将所有点包含在内——凸包问题。
凸包问题如果用seq2seq的方法不能做,因为输入输出的长度是不固定的。encoder可以处理长度不固定的input,但decoder的输出长度是固定的,所以不行。
类似于attention-based model,只是少了c的计算,h是attention weight,每次取weight最大vector。(x0,y0)是终结符,其weight最大时输出终结。
通过video造句的时候要均衡每个frame的weight之和,τ(tao)是事先设置的每个frame的weight之和,通过regularization使得各个frame的weight之和都在τ附近
Training: The inputs are reference.
Testing: The inputs are the outputs of the last time step.
所以测试时,有可能上一个output在train的时候没有见过,就会造成一步错步步错,这就是Exposure Bias
如果直接用output来train,会比较难train,因为每个input是上一个时间的output,当之前的还没有train好时,后面的都train不好,所以得从前往后挨个train,比较难。
一开始用reference概率大,然后再用自己的output
类似于解决贪心算法的缺点。Beam size = 2即Keep 2 best path at each step。就是每次分叉时选最好的2条路保留,走到头之后看哪个好
component级别的错loss不会很大,但这个句子就很有问题。所以可以尝试object级别的
不能微分就用强化学习,强化学习我就不介绍了,给个参考资料吧(太惨了,这是9月16日创建了final版,我之前打印的是3月份那版,还没有比较有什么区别)