【 学习周报 】
总结自己的学习和遇到的好材料。 最近新增小彩蛋,不要错过。
往期回顾:
- 学习周报20191208 | BILSTM-CRF,BERT
- 学习周报20191215 | NER综述
- 学习周报20191221 | charNER,bert-NER
- 学习周报20191228 | CS224N
- 学习周报20200105 | CS224N
变形金刚,是近几年NLP领域里程碑级别的一个工作——transformer,要理解bert等先进模型,还真是必须从transformer开始了解,而要了解ternsformer,你又不得不从机器翻译开始,最近CS224N学到了第六章,因此进行了很多系统性的学习,下面和大家简单谈一下吧。
机器翻译
这回我开始理解机器翻译的具体含义,seq2seq的基本结构我已经了解了。 个人感觉transformer到bert这一系列去年特别火的一套东西,还是要从机器翻译开始了解。
个人认为CS224N里面有关机器翻译的内容已经非常强大,因此大家耐着性子看完就能够理解机器翻译的原理:
- https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1184/lectures/lecture6.pdf
- 英文不好的话,可以看这个笔记:https://looperxx.github.io/CS224n-2019-08-Machine%20Translation,%20Sequence-to-sequence%20and%20Attention/
在这方面还只是小白的我看来,机器翻译核心是要理解encode-decoder的整体结构和思想,了解为什么要这么分,其实就差不多了,如果要深学,那就是各种改进的思路和想法了。
变形金刚
没错,就是transformer,这个东西可以说是改变了以RNN系列为核心模型的生态,并构建了KQV三种格式,这里需要理解的是query-key-value三种角色的具体含义以及在现实中的主要功能,这样基本的attention的出现和改进,甚至到后面的应用,尤其到了self-attention甚至是bert系列,才会有比较深刻的理解。
具体材料的话,个人感觉阅读的话优先级按照下面排序。
- CS224N里面的机器翻译开始看,里面会很自然的提到attention和transformer。
- attention机制似乎不完全是从“attention is all you need”开始的,前面已经有很多思路,一步一步看和理解,最终才回到transformer。
- 细节处,还是源码最详细可靠。(transformer源码,bert源码,albert源码)。
- 博客作为补充,优先看知乎的,部分排名靠前的搜索结果可能也会有错误,不过这些错误基本都已经被细心的网友发现,在评论中指出。
补充几篇可以参考的博客吧,基本都是注意力机制相关的。
- 张俊林的《深度学习中的注意力机制》
- 模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理、分类及应用https://www.cnblogs.com/think90/p/11619252.html
- Transform详解(超详细) Attention is all you need论文https://www.wandouip.com/t5i267822/
所以说,自己看懂,不盲目只看结论,有自己的判断。
这块内容感觉着实有必要单独写一篇文章,看看下周能不能写完。
小彩蛋
不定期给大家分享一些我看到的Trick。
gleu
一种relu的平滑版本。
1. `def gelu(x):`
2. `"""Gaussian Error Linear Unit.`
3. `This is a smoother version of the RELU.`
4. `Original paper: https://arxiv.org/abs/1606.08415`
5. `Args:`
6. `x: float Tensor to perform activation.`
7. `Returns:`
8. ``x` with the GELU activation applied.`
9. `"""`
10. `cdf = 0.5* (1.0+ tf.tanh(`
11. `(np.sqrt(2/ np.pi) * (x + 0.044715* tf.pow(x, 3)))))`
12. `return x * cdf`
论文链接已经标注在注释里面了,自己去看吧。
标签平滑
这个是tensorflow的源码中看到的(我的版本是1.12)。
1. `if label_smoothing > 0:`
2. `num_classes = math_ops.cast(`
3. `array_ops.shape(onehot_labels)[1], logits.dtype)`
4. `smooth_positives = 1.0- label_smoothing`
5. `smooth_negatives = label_smoothing / num_classes`
6. `onehot_labels = onehot_labels * smooth_positives + smooth_negatives`
具体位置大家
tensorflow/contrib/losses/python/losses/loss\_ops.py
里面。
有关原理可以参考和思路可以参考: https://blog.csdn.net/edogawachia/article/details/78552257。