p66,67:RNN:1.权值共享:减少网络中的参数量。
2.考虑上下文语境信息:用一个单元把上文信息记录下来,在计算当前层的h时,不仅要考虑当前层的输入,还要考虑上一层的h。
h0一般初始化为零向量。
p68:1.
2.RNN在空间上的层数不会像CNN一样那么长,一般会控制在2-10层之间。
3.使用nn.RNN初始化的参数:有3个,input_size:embedding的维度;hidden_size:记忆单元h的维度;num_layers:层数,默认是1,可以设置为2,4,...
4.h是每个记忆单元的信息,而out是所有输出的一个聚合。
p69:1.pytorch实现RNN:
2.对比多层RNN和1层RNN,h的层数变多了,但out不会变,因为out只取最后一层。
h:最后一个时间戳时的所有memory上的状态。
out:所有时间戳上的最后一个点的memory状态。
3.初始化RNN的另一种方法:参数同前一种方法。
(1)
(2)nn.RNNCell每次输入的是xt,且nn.RNNCell没有自动更新ht的操作;
而nn.RNN每次输入的是x,且nn.RNN有自动更新ht的操作。
(3)pytorch实现:
p70:1.预测正弦波:
(1)样例数据:
(2)网络:
(3)train:
(4)predict:
p71:1.梯度爆炸(Gradient Exploding):本来梯度在慢慢减小,突然间梯度变得很大。
(1)解决方案:每一次计算的时候都检查一下w的梯度信息,如果梯度>阈值,则用当前梯度除以当前梯度的模(方向保持不变),然后再乘阈值,这样就将梯度缩放到了阈值范围内。
pytorch实现:
先用for循环人工查阅一下是否出现了梯度爆炸的情况,如果出现了则对每一个p做一个缩放。
(2)一般梯度在10以内是比较正常的,100就比较大了。
2.梯度离散:由于梯度->0,参数长时间得不到更新,模型效果也不好。
p72,73:1.LSTM在一定程度上减少了梯度离散的出现。
表示信息过滤,表示简单的信息融合。
(1)第一道门
(2)第二道门:
注意:!=xt
(3)
(4)第三道门:
(5)理解三道门的另一种方式:
3.如何减轻梯度离散?:
将原本的梯度=Whhk变成了梯度=四项累加的和,大大减少了梯度特别小的情况的出现概率,从而有效减轻了梯度离散。
p74:1.nn.LSTM:
(此处的c表示记忆单元,等价于nn.RNN中的h,这里的h表示输出。此外,这里的c和h的形状是一样的。)
2.nn.LSTMCell:初始化参数同nn.LSTM。
(当h/c的层数为1时,可省略不写。)
(两层的情况)
p75:1.情感分类实战:
(1)推荐一个免费在线实验环境(gpu):
(2)加载数据:
(3)网络:
(4)embedding:
(5)train:
(6)test:
(感觉不太懂)p76,77,78,79,80,81,82:
1.GAN(无监督)
G:生成器;D:判别器。
(3)固定G,找到D的最优解。(令导数为0)
结论:当鉴别师(D)达到最优(D*)时,画家(G)经过训练也能达到最优(即达到和真实水平一样的水平,即pr=pg)
(不太懂)2.DCGAN:
将较小的一幅图变成较大的一幅图的方法有:(1)padding;(2)transposed convolution。
3.GAN训练不稳定的问题:
(1)产生原因:
公认的一个前提:在G没有训练的时候(即刚开始的时候),pr和pg是几乎没有重叠(overlap)的。
(不懂)
结论:只要!=0,即p和q不重叠,那么DKL一定是正无穷大,DJS一定是log2。
(2)解决办法:
1)离散情况下:可以用从P到Q需要的步数来衡量P和Q之间的相似度,步数越小相似度越高。
(针对离散的情况)
公式:
2)连续情况下:公式:
Wasserstein Distance(也叫Earth Move Distance,EM距离)。
p83:1.如何实现1-Lipschitz function?:
(1)weight clipping:不好
(2)WGAN-Gradient Penalty:好
2.WGAN的好处:
(1)更稳定;(2)可以用Wasserstein Distance来衡量两个分布之间的距离。
终于结束了~