一种新的embedding方法 ELMo

背景

word2vec以及glove在nlp任务中都取得了较好的效果。

“Deep contextualized word representations”, NAACL 2018

我们常用的获取embedding方法都是通过训练language model, 将language model中预测的hidden state做为word的表示, 给定N个tokens的序列(t1,t2,…,tn), 前向language model就是通过前k-1个输入序列(t1,t2,…,tk)的hidden表示, 预测第k个位置的token, 反向的language model就是给定后面的序列, 预测之前的, 然后将language model的第k个位置的hidden输出做为word embedding.

之前的做法的缺点是对于每一个单词都有唯一的一个embedding表示, 而对于多义词显然这种做法不符合直觉, 而单词的意思又和上下文相关, ELMo的做法是我们只预训练language model, 而word embedding是通过输入的句子实时输出的, 这样单词的意思就是上下文相关的了, 这样就很大程度上缓解了歧义的发生.

简介

ELMO(Embeddings from Language Models) ,来自于语言模型的词向量表示,也是利用了深度上下文单词表征,该模型的好处:

(1)能够处理单词用法中的复杂特性(比如句法和语义

(2)这些用法在不同的语言上下文中如何变化(比如为词的多义性建模)。

它首先在大文本语料库上预训练了一个深度双向语言模型(biLM),然后把根据它的内部状态学到的函数作为词向量。

该模型的显著特征:

  • Contextual: The representation for each word depends on the entire context in which it is used. (即词向量不是一成不变的,而是根据上下文而随时变化,这与word2vec或者glove具有很大的区别)
  • Deep: The word representations combine all layers of a deep pre-trained neural network. (采用了较深的网络来实现,如文中采用了双向的LSTM)
  • Character based: ELMo representations are purely character based, allowing the network to use morphological clues to form robust representations for out-of-vocabulary tokens unseen in training. (基于字符的,所以具有更好的鲁棒性)

效果上:ELMo虽然看起来很简单,非常有效。

ELMo: Embeddings from Language Models

ELMo用到上文提到的双向的language model, 给定N个tokens (t1, t2,…,tN), language model通过给定前面的k-1个位置的token序列计算第k个token的出现的概率:

$$p(t_1, t_2, …, t_N) = \prod_{k=1}^N p(t_k|t_1, t_2, …, t_{k-1})$$

后向的计算方法与前向相似:

$$p(t_1, t_2, …, t_N) = \prod_{k=1}^N p(t_k\vert t_{k+1}, t_{k+2}, …, t_{N})$$

biLM训练过程中的目标就是最大化:

源码

疑问

  • 通过char-level(CNN)+biLSTM的结构训练语言模型,最后获得输入层和隐藏层的表示,ELMo再将这些层进行线性组合,但是ELMo最后对每层的权重如何获得呢,是针对不同的任务继续训练以获得各层对应的权重?那么是否可以理解为attention呢?
    -

扩展阅读

ss

站在历史风口思考

从热门专业看风口、价值取向

  • 电气 - 已没落,因为
  • 通信 - 没落
  • 银行 - 没落 - 互联网金融的兴起

#

  • 炒房
  • 软件 -微软
  • 互联网

  • 智能手机

  • 物联网 - 并未没落
  • 大数据

2000年,伴随着Nasdaq的高台跳水,互联网产业的泡沫开始破裂,2001年,911事件爆发,全球的互联网产业达到了冰点。

  • P2P
  • 投资理财 - 钱多了怎么办?投资理财自然是最好的选择。

    • 自2012年开始,网贷公司迅速增加,2013年,随着余额宝的上线,各类理财宝宝们纷纷涌现,一时间所有的大型互联网企业都推出了自己的宝宝,百宝大战正酣时,收益率的显著下降一下子就让战争失去了悬念
  • 团购网

  • 云计算
  • 人工智能
  • 虚拟货币、区块链

精神层面

  • 美颜
  • 唱吧
  • 斗鱼、抖音
  • 唱吧
  • 喜马拉雅fm

2018科技风口的ABCD

人工智能(Artificial Intelligence)、区块链(Block Chain)、云计算(Cloud)、大数据(Big Data),互联网时代的下半场已经到来。

  • VR直播、短视频能成为风口
  • 医疗AI

从创业公司看风口

从transformer的实现,看深度学习的trick

简介

tensor2tensor中实现了常用的模型,主要包括transformer等

分解

  • dropout
  • norm_epsilon
  • moe
  • sampling_method=”argmax”, # “argmax” or “random”
  • use_target_space_embedding
  • conv_first_kernel

dropout

  • 在哪dropout,为什么?
  • dropout的比例?
1
2
3
"dropout": 0.2
"relu_dropout": 0.1,
"relu_dropout_broadcast_dims": "",

LayerNorm

LayerNorm(x + Sublayer(x)),

residual connection

layer normalization

residual之后加的LN

share vocab

share the vocabulary between source and target language

对应的参数:

1
"shared_embedding": false

共享词典的

  • 优势:
    • 方便专有名词的直接拷贝,比如人名地名
  • 缺陷:
    • vocab_size较大,会增大softmax的负担。
    • src和target会混淆。比如英中翻译,可能翻译出来的夹杂英文。

激活函数的选择

moe

1
2
3
4
5
6
7
model_dir": "./t2t_train/languagemodel_lm1b32k/transformer-transformer_small",
"moe_hidden_sizes": "2048",
"moe_k": 2,
"moe_loss_coef": 0.001,
"moe_num_experts": 16,
"moe_overhead_eval": 2.0,
"moe_overhead_train": 1.0,

tie embedding

1
2
3
# Nematus的配置: https://github.com/EdinburghNLP/nematus#network-parameters
tie_decoder_embeddings: tie the input embeddings of the decoder with the softmax output embeddings
tie_encoder_decoder_embeddings: tie the input embeddings of the encoder and the decoder (first factor only). Source and target vocabulary size must be the same

share the weights between softmax and embedding

对应参数:

1
shared_embedding_and_softmax_weights = True

源码
该trick,仅当src和target

lr相关

1
2
3
4
5
6
7
8
9
10
learning_rate": 0.2,
"learning_rate_constant": 2.0,
"learning_rate_cosine_cycle_steps": 250000,
"learning_rate_decay_rate": 1.0,
"learning_rate_decay_scheme": "noam",
"learning_rate_decay_staircase": false,
"learning_rate_decay_steps": 5000,
"learning_rate_minimum": null,
"learning_rate_schedule": "constant*linear_warmup*rsqrt_decay*rsqrt_hidden_size",
"learning_rate_warmup_steps": 8000,

lr变化曲线

weight相关

“weight_decay”: 0.0,
“weight_dtype”: “float32”,
“weight_noise”: 0.0

optimizer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
"optimizer": "Adam",
"optimizer_adafactor_beta1": 0.0,
"optimizer_adafactor_beta2": 0.999,
"optimizer_adafactor_clipping_threshold": 1.0,
"optimizer_adafactor_decay_type": "pow",
"optimizer_adafactor_factored": true,
"optimizer_adafactor_memory_exponent": 0.8,
"optimizer_adafactor_multiply_by_parameter_scale": true,
"optimizer_adam_beta1": 0.9,
"optimizer_adam_beta2": 0.997,
"optimizer_adam_epsilon": 1e-09,
"optimizer_momentum_momentum": 0.9,
"optimizer_momentum_nesterov": false,
"optimizer_multistep_accumulate_steps": null,

bucket

1
2


decode - length penalty - alpha

entropy loss - 用于避免重复解码

为什么会重复解码?因为length penalty会倾向于长句子。

复杂度作为penalty,input句子和output句子

也可以理解为

有一种幸福,叫做黑别人

  • 美国圣诞节的流浪汉,能上人民日报。台湾人说大陆喜欢吃香蕉皮。大陆人报导台湾总有美国人抱着台湾妞大马路上瞎撞人。有互联网真好,让交流不再闭塞。 –崔永元
  • 宣传就是统一口径,宣传很吓人 – 崔永元

普世价值

  • 为什么我们都觉得自由、民主、人权都是可以不在乎的呢?
  • 不让说纳税人,因为你强调纳税人,他会觉得自己是纳税人。
  • 不让说公民,要说人民。
  • 现在中国人没多少记得屈原了,只知道粽子。

  • 爱这个国家最好的方式,就是让他变好,哪怕不被理解。 – 崔永元,牛逼

  • 这个时代,明哲保身
    -

爱国

  • 小学课本: 我爱北京天安门,伟大领袖毛主席
  • 害怕开启民智,领导人希望被领导的,傻

  • xiaolinzhang: 我是80后,从亲身感受来看,几十年的民智的闭塞和压制,换来了相对稳定的社会环境,让我们平安度过了资本积累的最早时期。现在我们经济体量上来了,也越来越自信,无论是媒体还是教育,我自己的感觉是越来越开放。这种事本来就应该是循序渐进而不是激进的,企图一夜之间全面改变制度和思想,哪个国家和社会能有这样的承受能力,更何况14亿人口的大国。所以,我觉得,肯一点一滴默默为改良和改革贡献力量的人才是真爱国,我是信息和思想闭塞时代的亲历者,我不后悔也不会去谩骂,因为我知道这是国家发展必须要经历的阵痛,也里边也有我们这代每个人的贡献。

    • 连小时候经常看的日漫都不让播了,还好意思说越来越开放
    • 你太天真了,国内的新闻都是党媒控制的,很多都夸大事实真假难辨,正如崔永元所说的,统一口径
  • Kyrie CHen: 崔永元 是我見過最幽默風趣的大陸人!!奇才!!
  • 导师制:双向选择。班主任,分配制

#

light、fast RNN。

本文重点关注RNN cell的进化史,而非网络架构。

RNN的进化史,从简单到复杂(LSTM),然后浓缩(SRU、)





类似,先提出一种暴力解法,然后再优化的过程。

  1. LightRNN: Memory and Computation-Efficient Recurrent Neural Networks, NIPS 2016
  2. cudnnLSTM
    • 传统LSTM,8个矩阵,4个bias。cudnnLSTM,额外多了4个bias。用于加速
  3. Quasi-RNN
  4. bypass 的思想
    • 借鉴resnet
  5. attention的思想
    • single_point -> moving_average -> attention

并行加速

lstm的并行,通常是强制性的。

几套lstm,多卡运行,然后利用tower_grads的方式,更新参数。

小矩阵 类似SVD分解

CNN

使用纯 CNN 模型超过 RNN 并不是一件容易的事情。QRNN 则可以逐层替代原有的 RNN,使用起来门槛要低很多,而且加速效果有保证

https://blog.csdn.net/JackyTintin/article/details/77945354

QRNN 没有纯 CNN 模型(e.g. WaveNet)那么激进,依然保留了一些循环结构。

keras code: https://github.com/DingKe/nn_playground/tree/master/qrnn

GRU

SRU(Simple Recurrent Unit)。这实质上是 QRNN window 宽度取1的特殊情况(即使用普通的线性变换)。不同的是,SRU 将 highway 连接作为模型的一部分(QRNNs当然可以加残差或 highway 连接)。

SRU

扩展阅读

  • Optimizing Performance of Recurrent Neural Networks on GPUs, 2016, Nvidia
    ent Neural Networks on GPUs, 2016, Nvidia