总有一些东西你需要明白,走出云中
常见网络原理问题
1. RNN 的梯度爆炸/消失
- 也来谈谈RNN的梯度消失/爆炸问题:RNN中梯度消失的含义:距离当前时间步越长,那么其反馈的梯度信号越不显著,最后可能完全没有起作用,这就意味着RNN对长距离语义的捕捉能力失效了。
- RNN梯度消失和爆炸的原因,解释了链接1中提到的 \(\frac{dh_t}{\theta}=\frac{\partial h_t}{\partial h_{t-1}}\frac{\partial h_{t-1}}{\partial \theta}+\frac{\partial h_t}{\partial \theta}\), 也就是说 \(S_3 = W_x*X_3 + W_s*S_2+b_1\) 中,我们得到的 \(S_3\) 如果想对 \(W_x\) 或 \(W_s\) 求导,有两部分,即 \(S_3\) 直接对 \(W_x\) 求导,再加上 \(S_3\) 先对 \(S_2\) 求导,\(S_2\) 再对 \(W_x\) 求导。(当然实际还要往\(S_1\)倒,但是我们已经可以看出其导数的依赖性),问题的关键在于 \(\frac{\partial h_t}{\partial h_{t-1}}\) 也就是 \(\frac{\partial S_3}{\partial S_2}\),\(|\frac{\partial h_t}{\partial h_{t-1}}|\) 不可能一直等于1,当其大于1时,就会造成梯度爆炸,当其小于1时,梯度连乘则会造成梯度消失了(注意,这里的消失不代表为0,毕竟哪怕后面的都趋近于0了,我们还有一项\(\frac{\partial h_t}{\partial \theta}\) 不是,这里的消失,正如上面所说,只是丧失了对于长距离梯度的捕捉能力)。
- tanhx和σ(x)基本上是等价的,它们的导数均可以用它们自身来表示。
- RNN用tanh而不是relu的主要目的就是缓解梯度爆炸风险,用tanh,这还是因为它对应的 \(\frac{\partial h_t}{\partial h_{t-1}}\) 有界。事实上,处理梯度爆炸的最根本方法是参数裁剪或梯度裁剪。当然,裁剪的方式虽然也能work,但终究是无奈之举,况且裁剪也只能解决梯度爆炸问题,解决不了梯度消失。
- 而LSTM 的核心思想是,1个门我压不垮你,多来几个门还不行么。LSTM同时较好地缓解了梯度消失/爆炸问题,现在我们训练LSTM时,多数情况下只需要直接调用Adam等自适应学习率优化器,不需要人为对梯度做什么调整了。
2. 中文使用Bert要不要分词
- Bert作为现在大热的预训练模型,我们常常将我们的token串作为输入,然后希望经过Bert得到各个token串的embedding(这个embedding是结合了上下文生成的),那么有一个问题,我们每一个token对于中文来说,是传入"字"还是"词"呢?举个例子,我们把"单身狗"当做一个token传入,还是"单"、"身"、"狗"当做三个"字",有人会问了,这有区别吗,我把"单身狗"传入,Bert内部不也是会按字进行生成embedding吗(subword),这和我一开始就按"字"送进入不是没有区别吗。其实不然,如果我送进去的是"单身狗",Bert内部的subword会将其拆分为"单"、"##身"、"##狗",有人说则不就是多了两个#吗,有什么不同吗,确实会有不同,通过"##狗",Bert可以得知它和前一个字有关系,不是一个独立的字,也可以理解为学到了一些词的信息。但如果是按字,那么"单身狗"中的"狗",和独立的"狗",除了上下文,Bert不知道前者是在一个词中出现的。所以我们既然前面有分词、NER等步骤,可以得到一些词的信息,为什么不利用起来呢?
- 特别说,Bert 最后每个subword位置都会输出和其位置以及上下文相关的embedding,不是把相同的subword合并输出一个embedding,所以不用担心"家 ##养 ##狗"和"单 ##身 ##狗"的两个狗会无法区分~
- 其实也可以类比一下英文(毕竟Bert最初就是为英文设计的),词 'enjoyable' 就相当于我们的 "单身狗",英文中的每个字符=我们中文的每个字,也可以想象一下,要对一个英文句子中的各个单词编码,我们不能把它打散,一个个字符为单位输入吧(那词之间的含义完全消失不见了),主要的是英文subword后的,##able,也确实有一定的含义,某些词根之类的含义可以被捕捉的,个人感觉,比中文好的地方可能是Bert可以更好对英文word拆分subword,而我们中文的subword只能是单个字,不知道Bert能否拆分成,"单""##身狗"这种呢,也许如果可以学会这种拆分方式,也会多一些像英文的组合。(但好像也没有什么含义,毕竟英文中word的含义由词根体现,而中文的word的含义更多的部首偏旁,而上下结构,也没办法拆分,也许可以用多个filter的CNN去读"词"的图片,然后提取出不同的“”“部首偏旁”的特征,这样就成功类比了英文中的词根)CNN-[Su, et al., EMNLP’17]+BERT 毕设尝试一下!
3. 实体关系抽取任务,实体和关系为什么要一起做?
- 首先解释我们在关系抽取任务中要利用实体抽取(NER)中提供的什么,为了更好的进行RE,我们需要融合句子中实体的type、position等信息,而且给出一个句子,我们也要先知道谁是实体,才能找到两个实体之间的关系。
- 那么实体抽取的作用就是准确找出“谁是实体”+“实体的类型”,有的任务直接把NER中的实体的embedding用来做RE的输入,这就是给NER多增加了一个任务,可是在陈丹琦最新的工作中表明了,RE和NER不共享向量参数效果更佳。所以我们可以明确NER的作用就是上面两个。(如果要做出突破,我们也可以思考NER能不能带给我们一些其他的作用,也许可以以passage为单位进行,然后NER可以带给我们在同一篇文章中其他句子中对相同实体的embedding,我们再学习权重进行加权,这样不仅也许可以提高NER的识别精度[如果不需要提高精度,这个部分也可以放到relation中去,或者在RE和NER中进行两遍,核心思想就是利用到其他具有相同实体的句子提供的实体信息],也可以一起融合到RE中去,也就是说站在passage的角度考虑其中的各个句子)
- 有了NER提供的"谁是实体"+"实体的类型",我们传到RE中,利用对应的position和type,对句子和实体进行编码(使用<S:PERSOPN></S:PERSON>的作用就是让模型更关注我们实体的部分),然后将句子的embedding+两个实体的embedding进行融合,传入分类器进行分类。所以,RE的作用是“找出可以代表实体间关系的embedding”
posted @
2020-11-21 21:12
戴墨镜的长颈鹿
阅读(
113)
评论()
编辑
收藏
举报