返回 播客 学习 audios

序列到序列学习:从邮件自动回复到机器翻译

Quoc Le讲解序列到序列学习,涵盖RNN、注意力机制、束搜索等核心技术,并展示在邮件回复、翻译、语音识别等领域的应用。适合NLP和深度学习从业者。

序列到序列循环神经网络注意力机制
成长分 / 100 71 综合收获、行动、留存与影响

为什么值得读Quoc Le讲解序列到序列学习,涵盖RNN、注意力机制、束搜索等核心技术,并展示在邮件回复、翻译、语音识别等领域的应用

适合NLP和深度学习从业者

关键洞察
  1. 这条内容的价值在于把外部信息转化为可执行的判断和行动。
转成行动

Lex Fridman · 中文播客

查看原视频 ↗

节目文字稿

中文播客全文

Podcast Script (zh)

[0.120-8.897] SPEAKER_00: 我把它分成两部分:首先,一起开发序列到序列学习。 第二部分,把序列到序列放在更广的背景里,涉及很多令人兴奋的工作。

[8.977-16.662] SPEAKER_00: 现在,我们用一个例子来引入这个问题。 一周前,我度假回来,收件箱里有五百零八封未回复的邮件。

[16.742-20.108] SPEAKER_00: 很多邮件基本上只需要回答是或否。

[20.188-30.369] SPEAKER_00: 那我们看看能不能建一个系统自动回复这些邮件,回答是或否。 比如,有些邮件会是这样: 比如,我朋友An,她在主题里说嗨,然后她说:

[30.449-33.641] SPEAKER_00: 你要来越南过新年吗,Quoc?这就是她的内容。

[33.721-35.288] SPEAKER_00: 我可能回复‘是’。

[35.368-46.632] SPEAKER_00: 所以你可以再收集一组这样的数据,然后就有一些输入内容。 现在,我们先不管邮件的作者和主题,只看内容。 好的。 假设你... 你收集了一些邮件,输入就像这样:

[46.712-50.705] SPEAKER_00: 你要来越南过新年吗,Quoc? 答案是‘是’。

[50.785-55.568] SPEAKER_00: 另一封邮件是:今晚你和我们一起出去玩吗? 答案是不,因为我很忙。

[55.648-62.010] SPEAKER_00: 第三封邮件是:你读过那篇关于ResNet的酷论文吗? 对,就是因为我喜欢它。

[62.090-69.288] SPEAKER_00: 现在,我们来... 我们稍作处理。上一张幻灯片里, 有年份、逗号,然后是Quoc和问号,等等。

[69.368-80.643] SPEAKER_00: 所以我们处理一下,在年份和逗号之间加个空格。 然后是Quoc和问号,等等。 这一步,常叫分词和标准化。 那我们就这样做。 用我们的邮件来操作。

[80.723-83.648] SPEAKER_00: 现在... 第二步是特征表示。

[83.728-94.502] SPEAKER_00: 这一步,我要做以下事情。 构建一个2000维的向量。 2000代表英语词汇量。 然后遍历邮件。 统计某个单词在邮件里的出现次数。 例如...

[94.582-95.290] SPEAKER_00: 例如...

[95.370-109.618] SPEAKER_00: 单词R出现一次,所以我增加一个计数器。 然后U出现一次,再增加另一个计数器。 等等,还有S这些。 最后我会留个标记,专门记下所有不认识的字。 行吧? 然后……

[109.698-120.181] SPEAKER_00: 现在你成功…… 你要是这么做,就把所有邮件变成输入对输出,输入长度固定。 然后会得到一个两万维的向量,输出是0或1。

[120.261-121.398] SPEAKER_00: 明白吗?

[121.478-123.904] SPEAKER_00: 到现在有疑问吗?

[123.984-125.737] SPEAKER_00: 好的,很好。

[125.817-132.585] SPEAKER_00: 行。 那我会得到…… 就像你说的,有听众认为词序不重要,答案是肯定的。 所以这个问题我回头再讲。

[132.665-142.382] SPEAKER_00: 现在…… 这就是X和Y。 现在咱俩的任务,是找个W,让W乘X接近Y。 Y是输出,对吧? 这里的Y就是“是”和“否”。

[142.462-150.380] SPEAKER_00: 因为只有两类,你可以当成逻辑回归问题。 现在要是有人跟过Andrew的CS219课,很快就能推导出来。 但是…

[150.460-154.651] SPEAKER_00: 简单说,结果是这样。 你要给每封邮件建一个向量。

[154.731-162.532] SPEAKER_00: W是一个两列的矩阵。 好吗? 第一列算邮件回复“是”的概率。 第二列对应回复“否”。 然后就是算W的点积…

[162.612-164.957] SPEAKER_00: 第一列… 随机梯度下降。

[165.037-171.538] SPEAKER_00: 从迭代1跑到一百万次,跑很久很久。 随机取一封邮件X,看它的回复。

[171.618-207.129] SPEAKER_00: 如果回复是“是”,就更新W1和W2,提高猜对的概率。 所以增加第一个概率。 如果回复是肯定的,就增加答案为是的概率。 所以增加第一个概率。 如果回复是肯定的,就增加答案为是的概率。 所以增加第一个概率。 如果回复是肯定的,就增加答案为是的概率。 如果你答“是”,肯定概率就更高了。 如果你答“是”,肯定概率就更高了。 如果你答“是”,肯定概率就更高了。 如果你答“是”,肯定概率就更高了。 如果你答“是”,肯定概率就更高了。 如果你答“是”,肯定概率就更高了。 如果你答“是”,肯定概率就更高了。

[207.209-214.987] SPEAKER_00: 如果你答“是”,肯定概率就更高了。 W2 这样能提高邮件回复率。 作为否,第二概率,就叫它P1和P2吧。

[215.067-223.054] SPEAKER_00: 更新、增加概率,是什么意思? 就是求梯度的偏导数。 目标函数对参数的偏导,然后你得选一个。

[223.134-233.408] SPEAKER_00: 比如学习率alpha,w1等于w1加上... alpha乘logP1对w1偏导,好了... 我有点作弊,用了对数函数,因为...

[233.488-243.391] SPEAKER_00: 对数函数是单调递增的。 所以它是单调递增函数。 增加P1等于增加logP1,而且它... 通常用这个公式,随机梯度下降效果更好。

[243.471-251.714] SPEAKER_00: 目前问题,你可以更新,比如邮件要... 如果回复肯定,你可不同方式更新。 如果否定,那a是什么?

[251.794-262.068] SPEAKER_00: 有新邮件进来,取X,然后 转成向量,算第一个概率,好,w1乘X 除以e^(w1X)+e^(w2X),如果

[262.148-268.812] SPEAKER_00: 如果概率大于0.5,你说是。 小于0.5就说否。好了,这就是预测。 现在,这种表示有个问题:

[268.892-277.077] SPEAKER_00: 信息丢失。有听众说,单词顺序 不重要,没错。现在来解决: 用递归网络。我记得Richard soldier

[277.157-283.101] SPEAKER_00: 昨天讲过递归网络。Andrey也是。 Andre也是。递归网络思想:固定长度

[283.401-288.312] SPEAKER_03: 输入表示,但保留顺序信息,并且

[288.392-292.885] SPEAKER_03: 隐藏单元计算如下。函数h0是

[292.965-297.132] SPEAKER_03: 矩阵u乘以单词r的词向量

[297.432-299.579] SPEAKER_00: 双曲正切。

[299.659-310.572] SPEAKER_00: 好的,Richard昨天也讲了词向量。 可用word2vec的词向量,或随机初始化。 好,假设这是h(0)。接着h(1) 会是h(0)和

[310.652-313.020] SPEAKER_00: 向量u的函数,

[313.100-318.161] SPEAKER_00: 也就是a乘h(0)加u乘向量u的v。 然后你可以这么继续。

[318.241-322.025] SPEAKER_00: 这是最复杂的三张幻灯片之一,你们该提问。

[322.325-325.331] SPEAKER_02: 没问题?看来大家都熟悉循环网络了?哇。

[325.631-333.154] SPEAKER_00: 好,要用它预测,最后一步加标签,然后说,帮我预测y。 那怎么做呢?现在, 这里,我 基本上

[333.454-336.460] SPEAKER_03: 你 走之前的路,并且

[336.540-341.369] SPEAKER_03: 你更新w矩阵,顶部分类器,像我之前说的。

[341.669-343.062] SPEAKER_00: 现在,

[343.362-348.644] SPEAKER_03: 但你还要更新所有相关矩阵,即u、a和

[348.724-353.832] SPEAKER_03: 一些 词向量,对吧?所以你要算损失函数对这些

[354.132-358.578] SPEAKER_00: 参数的偏导。那很复杂,我自己做常出错,但有很多

[358.658-363.487] SPEAKER_00: 现成工具可用,比如TensorFlow自动微分,或Torch,或调用

[363.787-367.571] SPEAKER_02: 用蒂亚诺计算导数,有了导数就能更新,对吗?

[367.871-370.680] SPEAKER_00: u对所有都是一样的吗? 是的。

[370.980-381.173] SPEAKER_03: 还是看它在μ的哪一侧? 所以矩阵U是共享的,我要 回到一边。矩阵U是所有垂直矩阵共享的,对吧?

[381.473-387.359] SPEAKER_00: 大小得提前确定,比如列数 是词向量的维度,行数必须

[387.659-391.130] SPEAKER_02: 可以设成1000或255,这是模型

[391.430-399.615] SPEAKER_00: 选择,取决于欠拟合还是过拟合来 选大模型还是小模型,看计算能力,这样就能 训练大或小的模型。

[399.695-403.038] SPEAKER_00: 矩阵U?对。词向量的数量

[403.338-408.585] SPEAKER_02: 你用的尺寸是 词汇表大小,所以最终得到约两万个词

[408.885-417.162] SPEAKER_00: 向量。但大小...这意味着矩阵U有两万行 但列数你可以...抱歉,列数是两万 但行数你得自己定,好吗?还有

[417.242-419.157] SPEAKER_00: 其他问题吗?

[419.237-428.699] SPEAKER_00: 好,那整体情况是什么?整体是我从 世界的表征,我讲了I和N这种新方式。 表示可变大小的输入,能捕捉排序信息。

[428.779-438.519] SPEAKER_00: 然后我讲了自动微分,用来计算偏导数。 TensorFlow、Theano、Torch都有自动微分。 明白吗? 明白。 然后我讲了随机梯度下降训练神经网络。

[438.819-445.204] SPEAKER_02: 到现在有什么问题吗?你有问题吗? 如果数据系统一样,文件多长? 那取决于训练集和计算机大小。

[445.284-451.030] SPEAKER_02: 等等。通常用RNN,100个隐藏状态, 大概几小时。但取决于训练数据大小,

[451.330-455.242] SPEAKER_03: 因为要迭代很多次,采样很多邮件。

[455.542-463.042] SPEAKER_00: 对吧?希望算法看到越多越好。 对吧? 所以如果你只用‘是’‘不’这种算法, 你可能会失去很多朋友。 好的。

[463.122-468.369] SPEAKER_00: 因为不只是‘是’‘不’。比如朋友问我, 你要来越南过年吗?更好的答案是

[468.669-471.873] SPEAKER_02: 对,回头见。这样处理更好更友善,而且

[472.173-475.667] SPEAKER_00: 朋友问我今晚一起玩吗?我说不,我

[475.967-477.638] SPEAKER_02: 不,我太忙了。

[477.938-482.779] SPEAKER_03: 对吧?看过优惠券吗?我们来解决这个问题。在

[482.859-498.442] SPEAKER_03: 说解决方案前,这个问题基本上需要 把可变大小的输入和变量,映射到可变大小的输出。 对吧? 如果你能做到这样,就有很多应用。因为如果 你能做到,就有很多应用。

[498.522-508.762] SPEAKER_03: 因为如果你能做到,就有很多应用。因为 可以自动回复,这是我们一直在做的。还能做 用户翻译,比如英法互译。还能做图像字幕。

[509.062-519.580] SPEAKER_00: 输入是固定长度向量,来自ConfNet。输出是 猫坐在地垫上。对吧?或者做摘要,输入是一个文档 输出是摘要。或者做语音转录。我们要

[519.880-531.315] SPEAKER_03: 做它的摘要。输入可以是语音 帧,输出是词语。或者做对话。输入是 对话历史,输出是回复。或者问答等等

[531.395-535.586] SPEAKER_03: 等等。我们可以继续。那怎么解决呢?很难。

[535.886-548.276] SPEAKER_00: 看看安德烈·卡帕蒂对循环网络有什么看法。好的。 安德烈说,配置神经网络有很多种方式。 我们可以用神经网络映射循环网络,一对一映射,对吧?

[548.356-556.657] SPEAKER_00: 底部是输入,绿色是隐藏状态,输出 就是你要预测的内容。但一对一不行,对吧? 我们需要多对多。 所以更像……

[556.957-565.536] SPEAKER_03: 就像右边那两种。但我们最后选了红框里的方案。 这方案的好处是,输入输出的尺寸可以随便变。

[565.616-574.160] SPEAKER_03: 有时候输入小,输出大。 有时候输入大,输出小。所以用红圈里的方案…… 红圈里的那种……

[574.240-584.979] SPEAKER_03: 就特别灵活。对吧?如果选最右边那种,可能 输出必须小于等于输入。这正好…… 是我们不想要的。所以做个类似的方案。好了。

[585.059-588.530] SPEAKER_03: 比如输入是“hi, how are you?”,然后我们

[588.830-594.774] SPEAKER_02: 放个特殊标记,叫 end。 然后预测第一个标记“am”,接着 预测第二个“fine”,第三个“thanks”,继续

[594.854-598.638] SPEAKER_02: 直到预测出“end”就停。顺便提一下,

[598.938-610.060] SPEAKER_03: 之前幻灯片里我说了“yes”和“no”,在那种情况里只有 两个选择,明白吗? 现在你有了多余两个选择,实际上有两万个,还能继续。

[610.140-620.542] SPEAKER_03: 用逻辑回归算法,并扩展到覆盖多个选择。 或者超过两个,你可以有很多选择,明白吗?

[620.622-630.525] SPEAKER_03: 按照同样方式,这是我处理626的第一个方案。 但效果不好,原因是... 模型不知道上一步预测了什么,所以一直继续。

[630.605-643.236] SPEAKER_03: 它不断合成输出,但不知道说了什么,也不知道前一步。 做出了什么决策,所以更好的方案是这样。 就是把上一步的预测作为下一步的输入。

[643.316-648.517] SPEAKER_03: 好吗?比如我取"am", 输入下一步,就能预测第二个词是"fine"。

[648.597-653.438] SPEAKER_03: 等等,这叫自回归,把输出当输入。 有什么问题吗?

[653.738-658.289] SPEAKER_02: 怎么知道停?生成结束标记就停。 有个特殊标记, 是的。

[658.589-660.585] SPEAKER_03: 好了,那么所以...

[660.665-664.113] SPEAKER_03: 这里架构是编码器,也称

[664.413-668.186] SPEAKER_02: 输入循环网络,解码器输出循环网络,明白吗?

[668.486-678.424] SPEAKER_03: 那你怎么重新训练它? 基本上跑一百万步,看完所有邮件,然后 然后你每次迭代采样一个邮件X和一个回复,为什么?

[678.504-691.692] SPEAKER_03: 为什么?你知道我挺好的,谢谢,对吧? 然后在y里采样随机词yt,并且 然后更新iron、编码器和解码器参数,来增加y(t)概率

[691.772-694.906] SPEAKER_03: 根据之前看到的所有内容,对吗?

[694.986-706.363] SPEAKER_03: 哪个是你的y(t)? 减1,y(t)减2,等等,还有所有轴 好的 然后你得算偏导数让它工作,但计算模式很难

[706.663-712.131] SPEAKER_02: 所以我再建议你用自动微分这类工具 比如TensorFlow、Torch或Tiana

[712.211-714.161] SPEAKER_02: 好,你有个问题

[714.461-723.284] SPEAKER_03: 对,但循环网络的参数数量没变 因为你有u和v,u、v、a都固定,对吧?

[723.584-726.033] SPEAKER_02: 好,观众的问题是

[726.113-731.476] SPEAKER_02: 如果iron在不同例子里不同呢?答案是肯定的,所以步骤数不同。我

[731.556-733.448] SPEAKER_02: 我有个问题,就是

[733.748-734.502] SPEAKER_00: 好的

[734.802-737.054] SPEAKER_02: 对,下张会讲这个。好的。

[737.354-742.160] SPEAKER_03: 对,问题是实践中RNN该走多远。

[742.240-746.373] SPEAKER_03: 如果 通常400步左右停,因为更新太长。

[746.673-749.041] SPEAKER_02: 还有计算 计算成本很高。

[749.121-752.534] SPEAKER_02: 但你想的话可以走更多,对,我

[752.614-754.459] SPEAKER_02: 关于“是的”有个问题。

[754.759-757.812] SPEAKER_03: 对对对,所以这是个问题,如果

[757.892-765.693] SPEAKER_03: 先讲预测,然后你们提问。 好,那怎么做预测?第一个算法是贪婪解码。 好,贪婪解码就是

[765.773-773.551] SPEAKER_03: 对任意输入X,先找第一个词。 然后找到最可能的词,再反馈回去,然后

[773.631-778.994] SPEAKER_03: 然后找下一个最可能的词,再反馈,以此类推。

[779.294-784.994] SPEAKER_02: 一直继续,直到看到结束词。 然后停止,超过一定长度也停。好。

[785.294-801.167] SPEAKER_03: 这太贪心了。 所以我们其实做得少点,发现给定X可预测多个候选。 假设有K个候选,比如三个。所以有三个。 每个候选再往下拟合,最后得出三个结果。

[801.247-804.892] SPEAKER_03: 下一次,你就有九个候选了。

[804.972-809.743] SPEAKER_03: 对,然后你继续 往那个方向走,这里有张图。

[809.823-825.928] SPEAKER_03: 输入X,我就能预测第一个词高概率。 对,就基于每个这样的第一个词。 再送回网络,它会再生成三个,以此类推。 最后候选很多,怎么选最好的? 嗯,

[826.008-833.786] SPEAKER_03: 可以遍历每个束,算每步联合概率,然后找 那个 概率最高的序列。有问题吗?

[834.086-837.592] SPEAKER_02: 这是我演讲最复杂的一张幻灯片,确实。

[837.892-845.856] SPEAKER_03: 问题是在词汇表里的词怎么处理?其实呢, 算法里,对任何在词汇表的词,

[845.936-856.849] SPEAKER_03: 会创建“未知”标记,把所有词映射成未知,或者 不在词汇表的词都映射成未知。这看起来不理想,

[857.149-863.418] SPEAKER_02: 但通常效果还行。有一系列算法 来解决,比如分解成字符 之类的,就能搞定。对,对,这就是代价。

[863.718-872.576] SPEAKER_03: 函数是这样,我退一张幻灯片,成本函数就多一张。 成本函数就是随机采样一个词 yt,是的。 没问题。

[872.656-886.843] SPEAKER_03: 假设这是当前输入,我在采样 yt,比如 t。 等于2,就是说单词fine,我在fine这个位置,我想。 增加模型预测fine的概率,所以每次。

[886.923-890.928] SPEAKER_03: 模型会做很多预测,其中一些是错的。

[891.228-897.334] SPEAKER_02: 对吧,你有很多概率,针对单词的概率。 和概率。 等等,还有针对Z Z Z Z的概率,很多概率。

[897.634-904.971] SPEAKER_03: 你希望单词fine的概率尽可能高。 你提高那个概率,说得通吗?哦,你。

[905.051-914.954] SPEAKER_03: 以"I am"为条件,所以我在fine时,输入是high。 how are you 和 an arm,这是我看到的全部,我需要做出。

[915.254-921.279] SPEAKER_02: 一个预测,我必须做对,你知道如果。 我在thanks,输入是hi how are you and I'm fine,然后我必须。

[921.359-924.412] SPEAKER_02: 让thanks的概率正确,对吧,我有个问题。

[924.712-936.368] SPEAKER_03: 哦,我还没想到,问题是如何个性化。 嗯,一种方法是将用户嵌入为向量,假设。 你有许多用户,每个都嵌入为向量,这是一种方法。

[936.668-938.757] SPEAKER_02: 对,我想问个问题。

[939.057-943.004] SPEAKER_01: 嗯,问题是假设束搜索宽度是10,

[943.304-956.077] SPEAKER_02: 然后从10到100再到1000,突然快速增长, 对吧?序列很长就会得到K的几次方。 嗯,可以用截断束搜索,概率很低的序列, 直接剔除掉,不用保留。

[956.157-963.262] SPEAKER_02: 然后从3到9, 降到7,再回到9,如此继续。 这样不会产生大束。实际中束宽3或10就够了,效果很好。

[963.342-969.030] SPEAKER_02: 嗯,我有个问题。 好,比如a和n这种字母,现在不用填充输入来加速, 但有时需要填充,

[969.330-978.664] SPEAKER_03: 为了让处理效果最好。可以填充,但只针对你的标记。 假设序列长度10,就对应一个10的图。

[978.964-983.073] SPEAKER_02: 如果一批序列都是20的, 就创建20的图,以此类推。

[983.153-989.840] SPEAKER_02: 这样GPU会很开心。 如果一批总共20个序列, 就做一个20的图表,等等。 对,GPU会非常开心。 我有个问题。

[990.140-999.358] SPEAKER_05: 如果你会用用户嵌入 定制RAM管道,那 你会把这个嵌入连到这个网络? 作为初始状态,还是解码器,还是?

[999.658-1002.212] SPEAKER_01: 所以你是问,我理解是

[1002.512-1013.808] SPEAKER_03: 你的问题是,怎么把世界 嵌入插到模型里? 对吧? 不,是用户嵌入。 哦,用户嵌入。 哦,如果你想个性化这个, 那最开始,你有个向量。

[1014.108-1020.714] SPEAKER_02: 那是针对quark的向量,ID是12345。 如果是peter,那向量就是5678。

[1021.014-1025.983] SPEAKER_05: 所以peter就是初始向量 用于编码器,就像初始状态。

[1026.283-1037.291] SPEAKER_02: 是的,是的。 这是一种方法,是的。 嗯,不止一种方法。 可以最后做,或者开始时做。 或者每一步都插入它。 但我建议只放开头。 这样更简单。 好的。 我有个问题。 好,你来。

[1037.591-1043.233] SPEAKER_00: 嗯,因为你的预测… 就是把预测当主代码。 那你就得能指导它。

[1043.533-1044.322] SPEAKER_02: 是的。

[1044.622-1046.793] SPEAKER_00: 而且你的预测可能…

[1047.093-1054.395] SPEAKER_01: 并不指向你,因为他们没见过。 这个问题问得好。 问题就是模型跑偏了,对吧? 如果做了个糟糕预测,

[1054.695-1059.838] SPEAKER_02: 模型没看到,就不断跑偏。 就会输出垃圾。 对,好问题。 我等下会讲这个。

[1060.138-1073.117] SPEAKER_03: 嗯,这是一张幻灯片。 有一种算法叫状态。 计划采样。 计划采样就是, 训练时不提供真实值, 而是用softmax采样的结果。 也就是模型自己生成的内容,

[1073.197-1080.325] SPEAKER_03: 再作为输入喂进去,让它学会 如果生成的东西不好, 它还能自己调整回来,明白吧?

[1080.625-1082.691] SPEAKER_02: 所以这是一种解决办法。

[1082.771-1084.698] SPEAKER_02: 讲清楚了吗? 清楚了。

[1084.778-1087.227] SPEAKER_02: 有问题吗? 有个问题。 好的。

[1087.527-1090.023] SPEAKER_00: 解码器的内存有多大?

[1090.323-1099.657] SPEAKER_02: 比如到第10步时, 它会回到第一步吗? 对,是的。 那这个算法的问题在于 解码器有多大? 嗯,尽量大。 但这样会很慢。 在这个算法里,方法一样

[1099.957-1103.242] SPEAKER_04: 用固定长度的嵌入

[1103.542-1110.461] SPEAKER_03: 表示超长依赖,比如大输入,对吧? 这就成了问题。 等会儿再讲注意力模型。 好吗?

[1110.761-1114.429] SPEAKER_02: 有问题吗? 好。 有个问题。 那按单个词评分的话,

[1114.729-1119.535] SPEAKER_00: 有什么区别? 这不就错过同义词吗? 能不能用相同的句子回答?

[1119.835-1128.356] SPEAKER_01: 那模型能学会同义词吗? 这是问题吗? 那就是问题? 那问题到底是什么? 比如,你是在针对句子制造偏差?

[1128.656-1133.044] SPEAKER_00: 所以你的回答没问题,而且你 根据那个答案来评分。

[1133.344-1140.089] SPEAKER_01: 那个输入会不会变成不太可能的答案? 哦,我明白了。 嗯,是的。 事实是,如果你学了,它最终

[1140.389-1157.853] SPEAKER_03: 映射得挺好。 如果你把它可视化。 这不是嵌入。 像“好”和“不错”这些词映射得很接近 嵌入空间。 但在输出时,不知道还能做什么。 另一种方法就是用word2vec训练词嵌入,

[1157.933-1164.121] SPEAKER_03: 然后试着让模型回归 到词嵌入,对吧? 所以这是一种解决方式。

[1164.421-1170.701] SPEAKER_02: 我们试过类似的方法。 效果不太好。 所以我们这里的东西都不错。 好的。 我得继续了。

[1171.001-1178.942] SPEAKER_03: 但不管怎样,你看到的算法 其实能回复一些邮件。 所以,如果你用Inbox的智能回复,

[1179.242-1193.629] SPEAKER_04: 生产环境已经在用这个系统。 比如这封邮件里,我同事Greg Corrado, 收到朋友的邮件说:嘿, 想请你一起提前过感恩节。 11月22日办,下午2点左右开始。

[1193.709-1197.551] SPEAKER_04: 请带一道最喜欢的菜,下周前预约。

[1197.851-1204.596] SPEAKER_02: 然后它会给出三个回复。 比如第一个:“告诉我们你会来”。 第二个:“我们会去的”。 而第一个:“抱歉,我们去不了”。

[1204.896-1218.491] SPEAKER_03: 那这三个回复从哪来的? 那些就是束。 有一种算法能算出 束的多样性,避免结果太相似。 答案不一样。 有种算法,像启发式。 让光束更多样点。

[1218.791-1221.136] SPEAKER_02: 然后挑最好的三个给你。

[1221.216-1223.665] SPEAKER_02: 好,有问题吗? 嗯,我有个问题。

[1223.965-1228.307] SPEAKER_01: 怎么确保每束光都能到终点? 对,没法保证。

[1228.607-1237.767] SPEAKER_03: 那怎么保证光束能终止? 现在也没保证。 可能永远跑下去。 模型没训练好就会这样。 但训练得特别准的话,

[1238.067-1246.252] SPEAKER_02: 模型通常能终止。 几乎没见过不终止的。 但边缘情况会出怪事。 但设1000步或100步后停止,

[1246.332-1248.979] SPEAKER_02: 防止它一直疯跑。 我有个问题。 嗯?

[1249.279-1252.692] SPEAKER_05: 所以邮件没说要邀请多人, 但回复看起来全是。

[1252.992-1257.879] SPEAKER_01: 这很有意思。 对,它会出现,因为邮件很多。 如果你邀请某人,就不止一个人。

[1258.179-1266.805] SPEAKER_02: 也许它学到了感恩节的事。 就是邀请全家这种事。 对,它只从统计数据学。 对。 对。 对,或者有类似情况。 对。

[1267.105-1268.451] SPEAKER_01: 好。 好。

[1268.751-1271.641] SPEAKER_00: 所以如果波束给出未校正语法内容,

[1271.941-1275.145] SPEAKER_01: 你会做后处理吗? 哦,这个算法里,问题是,

[1275.445-1281.993] SPEAKER_03: 我有没有做后处理校正波束语法? 这个算法里,我们不需要做。 所以它就是直接输出的。

[1282.293-1282.931] SPEAKER_02: 对。

[1283.011-1287.178] SPEAKER_02: 好。 我还有个问题。 那这些输出的上下文关联度怎么样?

[1287.478-1290.508] SPEAKER_00: 它们跟某封特定邮件高度相关吗?

[1290.808-1297.135] SPEAKER_01: 还是更通用? 好,问题就是,上下文关联度怎么样? 所以我说,这里没有用户嵌入信息。

[1297.435-1300.859] SPEAKER_04: 所以它很通用。 输入是之前的邮件。

[1301.159-1306.441] SPEAKER_02: 输出是预测的回复。 我们就只有这些。 它看到了上下文,就是当前威胁。

[1306.741-1308.633] SPEAKER_01: 好。 我回答你了吗?

[1308.713-1314.541] SPEAKER_01: 好,你讲完再告诉我。 是吗? 手机还是服务器上运行? 哦,服务器上。 对,很慢。 问题?

[1314.841-1318.207] SPEAKER_00: 我猜肯定有邮件。 这些邮件不适合自动识别。

[1318.507-1320.956] SPEAKER_01: 我以为你说的是哪个邮件。

[1321.256-1324.820] SPEAKER_02: 哦,明白了。 所以问题是有一些邮件。 跟智能回复没关系。

[1325.120-1337.870] SPEAKER_03: 可能太长,或者你不该。 回复,或者类似情况。 所以实际上有两个算法。 一个算法只决定要不要回复。 然后它通过阈值后, 还有一个算法生成阈值。

[1338.170-1340.457] SPEAKER_02: 所以是两个算法组合。 其实我介绍过。

[1340.537-1344.670] SPEAKER_02: 早些时候,对。 我得走了,你回头再聊。 后面还有更多有趣的。

[1344.970-1356.243] SPEAKER_03: 好,目前整体情况怎样? 整体就是我们有个INN编码器。 覆盖了所有输入。 接着我们用INN解码器。 输出时每次预测一个标记。

[1356.543-1361.210] SPEAKER_04: 其他部分都一样。 所以用随机梯度下降。 来训练算法。

[1361.290-1364.204] SPEAKER_04: 然后做束搜索解码。

[1364.504-1369.728] SPEAKER_02: 通常用宽度3的束搜索。 然后就能找到好束。 概率最高的那个。

[1370.028-1377.388] SPEAKER_04: 有观众提了个问题。 就是固定长度表示。 预测前,h_n, h_n,白色那个,

[1377.688-1390.122] SPEAKER_03: 在解码前是固定长度表示。 可以理解为一个捕捉, 包含输入全部信息的向量。 可能一千词或者五个词。 但你用固定长度表示,

[1390.202-1395.008] SPEAKER_03: 处理变长输入不太理想。 所以我们得解决那个问题。

[1395.308-1401.310] SPEAKER_04: 所以有个算法正在出现。 其实是在蒙特利尔大学发明的。 你确定他在这儿吗?

[1401.610-1417.309] SPEAKER_03: 所以就是用注意力机制。 那注意力机制怎么工作? 所以原则上你想要这样的东西。 每次你预测之前, 假设你预测单词m, 你想再看一遍所有隐藏状态。 到目前为止。

[1417.389-1424.053] SPEAKER_03: 你想看到输入中到目前为止的所有内容,好吗?

[1424.353-1429.577] SPEAKER_04: 同样地,当你找到时,你也 想要看到所有的h。

[1429.877-1442.206] SPEAKER_03: 到现在及之后的所有输入隐藏状态。 那作为一个程序,你怎么做? 嗯,你可以这么做。 所以在hm处,你预测一个向量c。

[1442.506-1453.303] SPEAKER_04: 假设那向量与所有h维度相同。 所以如果你的h1维度是100, c也有100维。 取c,跟所有h做点积。

[1453.603-1458.595] SPEAKER_02: 然后有a、a0、a1等系数。 a到n,明白吗? 都是标量,明白吗?

[1458.895-1472.850] SPEAKER_03: 有了这些标量之后, 你算个叫beta的值,它基本上 是所有alpha的子最大值,对吧? 为了算那个,取指数。 bi是ai的指数除以 除以指数之和,明白吗?

[1473.150-1476.377] SPEAKER_04: 然后取那些bi,乘上hi。

[1476.677-1482.447] SPEAKER_02: 然后取加权平均。 然后求和。 然后把它发出去加额外信号 来预测单词m。

[1482.747-1494.020] SPEAKER_04: 然后继续这样,对吧? 下一步,你也预测另一个c。 然后取那个c算点积。 算a,然后就能算b。 拿出b,做个加权平均。 对吧? 然后传到下一步。

[1494.320-1499.765] SPEAKER_02: 送到预测阶段。 用随机梯度下降 训练所有东西,好吗? 这个算法在TensorFlow里实现。

[1500.065-1510.618] SPEAKER_04: 直观上,这里发生了什么? 假设你要做翻译。 比如翻译时,你希望, 输入是“嗨,你好吗?” 输出是 比如Hola, como estas,好吗?

[1510.698-1520.554] SPEAKER_04: 预测第一个词时, 希望hola对应“hi”,对吧? 因为一一对应 在hi和hola之间。 如果用了注意力模型, 你学到的beta值会给

[1520.634-1534.940] SPEAKER_04: 给“hola”赋予“hi”很大权重。 然后它给其他内容的权重就很小。 然后接着,你说"como"的时候, 它就会聚焦到"how"之类的,明白吗? 所以它调整了那个系数。 它特别强调相关词汇。

[1535.020-1540.848] SPEAKER_04: 尤其在翻译中特别有用。 因为你知道输入和输出是一一对应的。 到现在有什么问题吗?

[1541.148-1545.234] SPEAKER_02: 这确实很复杂。 对,我有个问题。 那你怎么处理语言?

[1545.534-1548.227] SPEAKER_00: 对于词汇不同的语言呢?

[1548.527-1566.850] SPEAKER_03: 哦,β、A和B都是学出来的。 所以我没有。 那语序不反转的语言怎么处理? 比如英语到日语,对吧? 有些动词会被移动,等等。 嗯,我没有硬编码A或B,它们是学出来的。 所以有些动词会移动之类的。

[1566.930-1573.814] SPEAKER_03: 嗯,A和B不是硬编码,是学习到的。 通过学习,他们就能弄清楚 该用多大的β值。

[1573.894-1574.846] SPEAKER_03: 对吧?

[1575.146-1579.894] SPEAKER_01: 来加权输入。 这基本靠梯度集来计算,对吧? 所以他们不断学习。

[1579.974-1581.982] SPEAKER_01: 好,我有个问题。

[1582.282-1592.765] SPEAKER_04: 。 好的。 对,问题是,有没有关于 在输出中加入注意力的研究? 对,我觉得能做到。 我对此不太了解, 但我觉得有可能。 这是能实现的。

[1593.065-1596.350] SPEAKER_02: 好像有人探索过类似方向。

[1596.650-1597.625] SPEAKER_01: 是的。

[1597.925-1598.923] SPEAKER_02: 有问题吗?

[1599.003-1602.009] SPEAKER_02: 哦,我有个问题。 还有个问题。 所以如果一行开头大写,

[1602.309-1609.913] SPEAKER_01: 就是说如果词表大小是N, 就不需要N维表示? 对对对。 问题是,假设现在, high是大写的。 对。

[1610.213-1619.233] SPEAKER_03: 对。 开头就表示我用2N还是N 的词表大小? 实际要归一化处理。 小数据集的话, 要归一化文本。

[1619.533-1625.454] SPEAKER_02: high变成小写等。 大数据集就无所谓。 直接学习就行。 懂了吗? 嗯。 我有个问题。

[1625.754-1628.284] SPEAKER_00: 其实本质上,这可以

[1628.584-1637.639] SPEAKER_01: 注意词语的条件性,对吧? 对,是的。 所以是的。 所以关键是,某种意义上,它是 获取输入中的位置信息。 嗯,我同意。

[1637.719-1646.623] SPEAKER_01: 我有个问题。 标点符号怎么办? 什么? 标点符号怎么办? 标点符号。 所以问题是,标点符号怎么处理? 嗯,目前我只是演示算法。

[1646.923-1654.887] SPEAKER_04: 好像就是个很简单的实现。 就是最基本那种。 但我想说的是, 在训练算法前,你可以先做一件事:

[1655.187-1663.209] SPEAKER_03: 单词和标点间加个空格。 以便做一些处理。 这一步叫分词或规范化。

[1663.509-1670.869] SPEAKER_02: 处理语言时。 所以你可以用斯坦福NLP这类工具 规范化文本用于训练。 如果有无限数据,它自己就能学会。

[1671.169-1675.336] SPEAKER_01: 好的。 我得赶紧继续,后面还有 很多例子和内容。 好的。

[1675.636-1684.517] SPEAKER_04: 实际上,这就是基本做法。 但想要好结果的话, 有大数据集时,你可以做一件事。 让网络更深。 让网络变深的方法是这样:

[1684.817-1689.228] SPEAKER_01: 把循环网络层层堆叠。 第一篇序列到序列论文里,

[1689.528-1696.435] SPEAKER_02: 我们用了四层,但现在逐渐 增加到六层、八层甚至更多。 效果也越来越好。 就像ImageNet,网络越深, 结果也会更好。

[1696.735-1711.261] SPEAKER_04: 好的。 如果你想训练带注意力机制的序列到序列模型, 几年前, 很多研究这个问题的实验室 都落后于当时最先进的水平。 但如今在翻译领域,很多

[1711.341-1713.593] SPEAKER_04: 翻译任务基本都用这种模型了。

[1713.893-1718.037] SPEAKER_02: 并且在很多WMT数据集上达到最先进。

[1718.337-1726.359] SPEAKER_04: 所以训练这个模型,首先,像我说的, 你可能会遇到词汇量大的问题。 比如巴拉克·奥巴马就是未知词,对吧?

[1726.659-1736.260] SPEAKER_02: 希拉里·克林顿也是未知词。 现在你可能会用词片段的方法,对吧? 也就是把词切分开。 比如巴拉克·奥巴马会被切成 bar 和 rock 等等。

[1736.560-1758.668] SPEAKER_04: 或者你可以用各种智能算法。 比如词和字符的拆分。 你可以把未知词拆成字符, 然后当字符处理。 斯坦福有一些相关工作,他们 证明它效果不错。 所以这算个办法。 第二招:你得这么做。 你必须这么做。 你必须这么做。 你必须这么做。 训练这个算法时,

[1758.968-1769.649] SPEAKER_03: 因为做反向或前向传播时, 你要做乘法运算。 实际上会多次乘以一个矩阵。 所以梯度或函数值会爆炸,

[1769.949-1780.409] SPEAKER_04: 或者也会消失。 你可以裁剪梯度, 到某个值,对吧? 如果梯度的大小 大于10,就设成10。 行吧? 第三招:用GRU,或者我们

[1780.489-1796.211] SPEAKER_04: 用长短期记忆网络。 好,再聊聊这个LSTM网络。 业务一点点。 好,什么是长短期记忆? 如果你用INN单元,基本上你 把输入和隐状态拼起来, 然后乘以一个theta,

[1796.291-1798.624] SPEAKER_04: 然后用一个激活函数。

[1798.924-1803.033] SPEAKER_03: 比如说。 双曲正切函数,对吧?

[1803.333-1813.271] SPEAKER_04: 这是INN的简单函数。 LSTM中,你把输入和哈希 乘一个大矩阵。 我们叫它theta。 那个theta比

[1813.351-1824.403] SPEAKER_04: 我在INN单元里说的theta大四倍。 然后你得到z,那是输出。 你把它分成四块。 每块,你可以算出门。 然后你用那个叫单元的值,

[1824.483-1837.976] SPEAKER_04: 然后你不断把新算出的值 加到单元上。 这部分我管它叫C积分。 它主要是保持隐藏状态,不断往里加信息。 它不停往里面加信息。 所以它不会让信息翻倍。 而是不断加进去。

[1838.056-1843.779] SPEAKER_04: 如果只是用,不用了解太多。 因为LSTM在TensorFlow里已经实现了。

[1844.079-1846.633] SPEAKER_01: 到现在有什么问题吗?

[1846.933-1859.416] SPEAKER_04: 应用上,你可以用它做摘要。 用来做摘要。 我看到很多摘要方面的工作,很兴奋。 你可以做图像描述。 这时输入只是图像的表示。 来自VGG或GoogleNet这些。

[1859.716-1864.545] SPEAKER_02: 然后送到RNN。 RNN会帮你解码。 或者用它来做语音识别或转录。

[1864.845-1870.429] SPEAKER_04: 或者用来做问答。 所以下一部分, 我简单讲讲语音识别,好吗?

[1870.509-1884.072] SPEAKER_04: 语音识别中,输入可以是某种形式 形式,对吧? 输出就是一些单词,你知道吗? 嗨,怎么样? 嗯,你可以把输入裁剪 成窗口 那就是绿色框 然后你裁剪很多这样的窗口

[1884.152-1893.892] SPEAKER_04: 然后把多个送入RNN 送入RNN前转换成MFCC MFCC或语谱图之类的,好吗? 再用我之前说的算法

[1893.972-1903.886] SPEAKER_04: 然后结合注意力机制转录 输出端一次预测一个词 算法的问题是,处理语音时 你会得到很多输入,对吧? 可能有成千上万个时间步

[1903.966-1912.963] SPEAKER_04: 所以即使有注意力,时间反传也难 你可以构建一个金字塔 来映射输入 所以层数够多,就能把输入分割开。

[1913.043-1921.100] SPEAKER_04: 层数够多,分成8或16份,对吧? 然后产生输出。 我们正在研究一个方案。 输出其实是字符。

[1921.180-1931.222] SPEAKER_04: 就像百度那样,用了CTC。 这点我得说一下。 这个算法的优势是,我其实 输出里有个隐式语言模型。 比如单词how,它实际上

[1931.302-1937.432] SPEAKER_04: 依赖前面的hi之类的,对吧? 也包括输入。 所以已经有个隐式语言模型了。

[1937.512-1946.509] SPEAKER_04: 但问题是你其实 必须等输入结束才能解码。 所以解码得离线进行,行吗? 行吗? 好的。 所以如果用在语音搜索上,

[1946.809-1957.130] SPEAKER_03: 可能不太好,因为用户 我们马上看看输出,行吗? 所以这时候有个算法 它能利用这点,在线一块块处理。 一块块来。

[1957.430-1965.696] SPEAKER_04: 另外,在翻译里, 带注意力的序列效果不错。 这是最先进技术之一,但语音上, 表现不如CTC。

[1965.776-1970.524] SPEAKER_04: 至少已发结果里,我们不如CTC, Adam之前提过。

[1970.824-1979.601] SPEAKER_02: 或HMM-DNN混合模型,目前最常用 语音系统。 我先停一下,然后回答问题。 有问题吗? 后面有人提问。

[1979.901-1982.234] SPEAKER_00: 嗯? 你是搞机器学习的?

[1982.534-1984.031] SPEAKER_02: 你不是。 是的。

[1984.331-1986.780] SPEAKER_00: 你刚提到注意力。

[1987.080-1991.828] SPEAKER_02: 所以对英语和德语来说。 嗯,对。 有个词。 但英语里,意思不止一个词。

[1992.128-1994.275] SPEAKER_00: 那注意力是怎么工作的?

[1994.575-1998.603] SPEAKER_05: 因为注意力会集中在意义上, 这个意义。 但你在预测它。

[1998.903-2001.677] SPEAKER_00: 你只会预测一个特定词。

[2001.977-2005.065] SPEAKER_01: 那翻译中怎么工作?基本上就是,

[2005.365-2011.611] SPEAKER_02: 我们有成对句子,比如嗨你好吗和hola como estas。 然后这些句子对输入到序列

[2011.911-2021.407] SPEAKER_04: 注意力里,每一步我们一次次预测一个词,但在 预测前,模型有注意力,所以它又看了输入。 这就是原理。那模型的问题是什么,

[2021.487-2022.322] SPEAKER_04: 你说?

[2022.622-2026.615] SPEAKER_01: 所以你看,比如i从1到b时,在预测时,

[2026.915-2030.421] SPEAKER_05: 序列中它说的第一个词,预测其实只是 一个大词。

[2030.721-2036.827] SPEAKER_01: 明白了。嗯,不太明白,私下聊吧。行吗?行。 嗯,那咱们可以做点纸。好,一起。

[2037.127-2039.216] SPEAKER_02: 我有个问题,嗯。

[2039.516-2044.009] SPEAKER_00: 比方说,你在收件箱里用不同语言写邮件,比如越南语? 嗯。

[2044.309-2044.982] SPEAKER_01: 嗯。

[2045.282-2046.117] SPEAKER_00: 嗯。

[2046.417-2063.730] SPEAKER_01: 好,我展示的模型和收件箱都是英文的,但模型没语言限制。假设你有时写英文、有时越南文、有时西班牙文,通过用户嵌入个性化,它会学你的行为,预测你想要的词。 但得确保输出词汇量够大,不光英文,还覆盖西班牙文、越南文等。

[2063.810-2070.717] SPEAKER_01: 那词汇量就不是两万了,而是十万,因为选择更多。然后得在这些例子上训练模型。嗯。

[2071.017-2077.646] SPEAKER_04: 就训练数据的问题。好,我有个问题。 你提到语音搜索没法在线翻译。 嗯。

[2077.946-2082.439] SPEAKER_01: 那能不能改一下模型,不用等到语音搜索结束才开始预测?

[2082.739-2087.522] SPEAKER_04: 所以词汇量不是两万,而是十万左右,因为你

[2087.822-2094.648] SPEAKER_01: 有更多选择,然后得在这些例子上训练模型。是的。 就训练数据的问题。好,我那儿有个问题。

[2094.948-2102.610] SPEAKER_00: 你提到语音搜索没法在线翻译。 嗯。 那能不能稍微改一下模型,不用从头开始? 在语音搜索结束时做预测?

[2102.910-2110.108] SPEAKER_01: 嗯,问题就是,语音搜索现在你得听完才能预测。 还有别的办法吗?有,你可以分块预测。

[2110.408-2120.961] SPEAKER_04: 对,其实可以设计一个简单算法来分割语音, 然后做预测,再把结果传下一块。 这样就能继续下去,理论上能在线解码。

[2121.041-2130.224] SPEAKER_04: 但我要说,在线解码这项研究还在进行中。 在线解码是可以的,但还在进行。这样行吗? 好的,我有个问题,关于谷歌的在线?

[2130.524-2132.253] SPEAKER_02: 在线?嗯。

[2132.553-2137.881] SPEAKER_05: 如果搭这个系统,你们怎么设置训练数据? 因为很难知道,比如这个问题,你怎么知道

[2138.181-2140.770] SPEAKER_00: 这就是你能创建的答案?

[2141.070-2147.234] SPEAKER_04: 哦,对,有输入邮件和专家写的输出邮件, 然后就能那样训练它。

[2147.534-2150.599] SPEAKER_05: 所以就有一些能为此服务的训练数据集?

[2150.899-2155.647] SPEAKER_01: 嗯好的,我有几个问题。 好的。 序列到序列模型对对应约束不多,

[2155.947-2165.502] SPEAKER_00: 而CTC有从左到右约束。能否加这个约束让它更好? 向右。能否加这个约束到序列到序列模型让它更好? 或者类似的东西?

[2165.802-2169.552] SPEAKER_01: 对,在语音识别里,CTC这框架很棒。

[2169.852-2180.788] SPEAKER_04: 因为它是对齐的,输出输入单调递增。 但CTC假设独立,没包含语言模型。 也许序列到序列模型能行?嗯,好主意。

[2181.088-2185.581] SPEAKER_01: 也许一起写篇论文? 好,我还没看过,但这主意很好。有问题吗? 。

[2185.881-2188.249] SPEAKER_00: 。 。

[2188.549-2195.433] SPEAKER_01: 懂了,太好了。问题是我们现在一步步预测, 能否全局看输出,用强化学习调整?可以。

[2195.513-2199.158] SPEAKER_01: 最近Facebook有篇论文,叫序列级训练,

[2199.458-2207.793] SPEAKER_04: 他们不一步步优化,而是全局看输出, 尝试提高词汇率或翻译蓝评分。 看起来他们关心的指标有改进。

[2207.873-2217.056] SPEAKER_04: 但如果把结果给人看, 人们还是更喜欢这个模型输出。所以, 翻译等指标可能并不完美。 。 好的。

[2217.136-2222.441] SPEAKER_04: 成了我们的优化指标。 。 下一步预测,翻译中很受欢迎。

[2222.741-2226.189] SPEAKER_00: 。

[2226.489-2229.913] SPEAKER_02: 能加GAN损失吗?好主意。 对,我有个问题,嗯?

[2230.213-2233.057] SPEAKER_00: 。 好,根据输入,能否动态改? 。

[2233.357-2236.747] SPEAKER_04: 对,输入第一个词hola,就能

[2236.827-2246.347] SPEAKER_04: 从那儿开始BIM。 问题,能否整合用户输入? 比如你想说hola,嗨,你好吗? 输入hola后,就限制了BIM。

[2246.427-2251.930] SPEAKER_04: 根据hola调BIM,BIM会 更好。 对,好主意。 我有个问题。 。

[2252.230-2257.756] SPEAKER_00: 你手上有多少数据? 。 你手上有多少数据? 。 你手上有多少数据? 。 你手上有多少数据?

[2258.056-2274.440] SPEAKER_01: 。 你手上有多少数据? 你手上有多少数据? 你手上有多少数据? 你手上有多少数据? 你手上有多少数据? 你手上有多少数据? 你手上有多少数据? 你手上有多少数据? 你手上有多少数据? 你手上有多少数据?

[2274.740-2292.923] SPEAKER_04: 你手上有多少数据? 你手上有多少数据? 哦,那你有多少数据? 哦,那你有多少数据? 哦,那你有多少数据? 哦,那你有多少数据? 哦,那你有多少数据? 哦,那你有多少数据? 你的语料库通常有数千万个句子对。

[2293.223-2299.422] SPEAKER_01: 类似这样,每个句子平均有20个词。 平均值20到30,记不清了,但差不多。

[2299.502-2305.864] SPEAKER_01: 数量级,对。我有个问题没听清。那它怎么样? 跟谷歌自动补全比?说实话,我不知道。

[2305.944-2316.044] SPEAKER_01: 谷歌自动补全底层用啥?但我想如果… 它们用了,我觉得也该用类似,因为可以。好,我… 还有很多有趣的要讲。好,那么什么是

[2316.344-2326.967] SPEAKER_04: 大局?大局是,到现在我讲了Gosto的 学习,昨天Andrew讲了大部分大趋势 深度学习,他讲的第二个趋势基本上是做

[2327.047-2341.678] SPEAKER_04: 端到端深度学习,所以你可以把序列到序列 学习也叫做端到端深度学习。现在这个框架非常 通用,所以应该适用于很多NLP任务,因为很多它们

[2341.758-2351.939] SPEAKER_04: 自然语言处理里,有输入和输出序列。 输入是文本,输出是依存树之类。 数据多时效果很好,但数据少时…

[2352.019-2369.320] SPEAKER_04: 数据不够时,考虑把问题分解成小部分。 在小部件上训练序列到序列模型。 合并模型。数据不多,但相关任务多的话… 相关任务多,可以合并它们。 组合数据,加标识位区分任务。

[2369.400-2376.702] SPEAKER_04: 比如翻译、摘要、邮件回复,再调整记录。 这样能改善输出。序列到序列部分讲完了。

[2376.782-2383.864] SPEAKER_04: 下一部分,把序列到序列放在更大背景下。 关于神经网络在NLP里的前沿工作。

[2383.944-2388.367] SPEAKER_04: 用于NLP。现在有问题可以问,我回答两个。

[2388.667-2393.473] SPEAKER_02: 时间不多了,有问题吗?有。 问题是,模型怎么处理表情符号?

[2393.773-2401.992] SPEAKER_01: 表情符号?不确定,但它也是文本。 可以当作额外标记输入,扩词汇量到20万。 词汇量到20万,就能覆盖表情符号。

[2402.072-2408.097] SPEAKER_01: 嗯,我有问题。新数据进来,你想… 嗯,我有个问题。如果有新数据进来,你想……

[2408.177-2412.286] SPEAKER_01: 我进来了,要重新训练吗?嗯,快结束了。

[2412.586-2423.441] SPEAKER_04: 降低学习率,加新数据影响不大。 更新后,通常可以加新数据提高学习率。 继续训练。好的,我问了两个问题。

[2423.521-2439.266] SPEAKER_04: 继续。有个活跃领域,其实没那么... 活跃领域确实很活跃,因为... 训练过程,索引内的训练是必须的。 很令人兴奋,就是自动问答领域。 可以认为设置是这样的: 能读维基百科,然后回答问题吗?

[2439.346-2451.223] SPEAKER_04: 或者读一本书,再回答问题? 理论上,可以用序列到序列。 结合注意力机制来完成。 所以看起来是这样。 逐词读这本书。 伴随着书。 然后读问题。

[2451.303-2455.830] SPEAKER_04: 然后用注意力机制。 查看所有页面。 然后预测标记。

[2456.130-2462.318] SPEAKER_03: 所以有时候我们确实会回答这个问题 用那种方式 有时候我们对事实不了解

[2462.618-2475.356] SPEAKER_04: 所以我们重新看书来回答事实 但很多时候,如果你问我 巴拉克·奥巴马是不是美国的 总统? 我会说,是,因为已经记住了 所以也许最好增强I和N

[2475.436-2486.233] SPEAKER_04: 加上某种记忆,这样它就不会 再次回顾了 再次回顾有点烦人 所以这是研究的活跃领域 我不是专家,但非常了解 所以我能带你了解正确背景

[2486.313-2498.933] SPEAKER_04: 这个领域的工作包括Western记忆网络 还有Facebook的研究人员 DeepMind有机器 动态记忆网络是Richard Solter昨天 提出的,然后是栈增强的I和Ns 再通过脸书等等。

[2499.013-2509.148] SPEAKER_04: 现在,我给你看个大概,什么? 这个增强记忆是啥意思? 所以,想想注意力。 注意力就像这样。 在编码器里,你要看这个。 你要看一些输入。

[2509.228-2524.195] SPEAKER_04: 然后你有个控制器,就是H变量。 然后你不断更新H。 同时,你要写入存储器。 你的H1、H2、H3等等。 你把它存到存储器里。 清楚,对吧? 在解码器里,你要做的是

[2524.275-2533.539] SPEAKER_04: 继续产生一些输出。 你更新控制器G。 但你要从存储器读H。 好的,对吧? 所以,输入时写入存储器。

[2533.619-2550.537] SPEAKER_04: 然后输出时从存储器读。 现在,我们来试试更通用的情况。 通用就是,在任何时间点, 你可以读取和写入。 你有个控制器,可以读写, 随时都能读写。 要办到,得按一种架构来。

[2550.617-2560.717] SPEAKER_04: 所以你有一些记忆库。 一个大的记忆库,对吧? 然后你可以进行写入。 你可以决定把一些信息写进去, 通过上一步的记忆库

[2560.797-2570.955] SPEAKER_04: 和上一步隐藏变量组合。 然后你也读入隐藏状态。 然后你可以更新数量。 然后就能这样一直继续。 这个概念就叫增强记忆RNN。 好吗?

[2571.255-2572.810] SPEAKER_01: 这个清楚吗?

[2572.890-2575.281] SPEAKER_01: 有问题吗? 有个问题。

[2575.581-2587.817] SPEAKER_04: 阅读时,得读取整个记忆库吗? 问题是,阅读时你是否 读取整个记忆库? 很多这类算法,其实是软注意力。 所以是的,它会查看整个记忆。

[2587.897-2601.866] SPEAKER_04: 其实你可以预测要看的位置,然后 只读那个块。 这么做结果就是,你会变得非常 它不再可微了,对吧? 因为你没读取的部分 对梯度没贡献。 所以训练会很困难。

[2601.946-2611.744] SPEAKER_04: 但可以用强化学习等方法来训练。 最近有篇论文,关于强化学习 神经图灵机,它其实做了类似的事, 对吧? 不完全是。 但它会处理离散动作。

[2612.044-2612.961] SPEAKER_02: 好吗?

[2613.261-2614.689] SPEAKER_01: 有问题吗?

[2614.989-2616.498] SPEAKER_02: 没问题。 哇。

[2616.798-2618.051] SPEAKER_01: 好的。

[2618.351-2627.453] SPEAKER_04: 所以另一个很多人聊的扩展。 就是用了增强操作的RNN。 所以你要增强神经网络。 用加法这种操作。 减法、乘法。 正弦函数啥的。

[2627.533-2638.492] SPEAKER_04: 很多函数。 为了激励你,考虑问答。 可以归入这类。 比如这个情境。 这建筑是2000年建的。 后来,人们说, 哦,它2010年被毁了。

[2638.572-2653.017] SPEAKER_04: 问题是,这建筑 存在了多久? 答案是10年。 现在你会怎么回答? 说2010年,就减2010? 用大量例子训练神经网络,它也能做到。 它也能做到。

[2653.097-2662.919] SPEAKER_04: 它可以学减法这类。 但这需要大量数据。 所以最好增强它们。 加上加减法等操作。 所以可以这样:神经网络会

[2662.999-2671.381] SPEAKER_04: 读取所有标记,然后 把数字压入堆栈。 然后增强神经网络。 用加减法功能。 然后分配概率。 给这两个函数。

[2671.461-2683.175] SPEAKER_04: 颜色越深概率越高。 所以你分配两个概率。 然后算加权平均。 值来自这两个函数。 然后取那个值。 然后弹出,再推入。 下一步,放入堆栈。

[2683.255-2696.539] SPEAKER_04: 然后下一步,调用加法。 再做减法,等等。 这就叫神经。 或者叫神经程序员解释器。 去年,谷歌大脑发了两篇论文。 讨论了这个问题。 这些是相关的工作。

[2696.619-2706.255] SPEAKER_04: 在增强循环网络方面。 比如操作、记忆等等。 那大局是什么? 好,关于大局,再回顾一下。 而今天我讲的。 就是序列到序列学习。

[2706.335-2721.198] SPEAKER_04: 这是端到端的深度学习任务。 这是自然语言处理的大趋势之一。 它很通用。 所以如果有大量监督数据。 这是一种监督学习算法。 所以有大量数据的话,它应该可以。 效果不错。

[2721.278-2734.202] SPEAKER_04: 但要是监督数据不够, 那你可以把问题拆开, 再在不同组件里训练。 或者用多任务联合训练。 也有人跟自动编码器一起训练。 也就是说,你读入句子, 再预测输出句子。

[2734.282-2747.485] SPEAKER_04: 这样也行。 然后跟所有任务一起训练, 这个也管用。 回家后,你想 影响明天的工作, 那现在来看,一切顺利。 这能产生一些影响。 现在,想搞点研究,

[2747.565-2752.348] SPEAKER_04: 记忆、操作、增强这些, 是很让人兴奋的方向。

[2752.648-2757.071] SPEAKER_02: 但好像还在进行中。 不过估计很快,这领域会有大进展。

[2757.371-2772.141] SPEAKER_04: 想了解更多,可以看看 在Chris Ola的博客上。 他讲了注意力机制和增强记录器网络。 我也写了些教程。 很简单。 带注意力的序列到序列翻译模型 用TensorFlow实现。

[2772.221-2783.018] SPEAKER_04: 所以你可以下载TensorFlow 然后训练它,就像我今天说的。 现在这个领域有很多工作在进行。 其中很多不是我的工作。 所以你看,这些字都看不清了。

[2783.098-2787.741] SPEAKER_04: 这个领域涌现了很多论文。 所以先停一下,我还有五分钟 来回答问题。

[2788.041-2790.107] SPEAKER_02: 那里有一个问题。 是的。

[2790.407-2793.959] SPEAKER_00: 你刚才讲问答,比如读一本书

[2794.259-2796.755] SPEAKER_02: 然后从书里找到答案。 是的。

[2797.055-2803.045] SPEAKER_00: 如果你有个跟上下文相关的书籍语料库, 这会是获取答案的正确方式吗?

[2803.345-2804.598] SPEAKER_02: 嗯哼。

[2804.898-2808.044] SPEAKER_00: 那么,如果你有个iPod或其他书,

[2808.344-2811.397] SPEAKER_02: 这是不是你更常用的读书方式?

[2811.697-2814.332] SPEAKER_00: 而不是语料库,对吧?

[2814.632-2818.080] SPEAKER_01: 是的。 从你放进去的内容里取出来。 我明白了。

[2818.380-2824.568] SPEAKER_04: 你能对着麦克风说话吗? 因为我听不太清楚。 用麦克风,这样大家也能听到。 .

[2824.868-2825.936] SPEAKER_00: . . .

[2826.236-2840.542] SPEAKER_05: . 所以,你在训练一个问答网络的时候, 所以你以从书里训练为例, 来回答问题。 嗯。 比如哈利·波特,他父亲是谁? 嗯。 可能很多书里 都有个叫哈利的角色。 嗯。 所以得看上下文, 要知道指的是哪个哈利。

[2840.622-2844.012] SPEAKER_05: 嗯。 训练这种问答网络时, 怎么处理上下文?

[2844.312-2846.320] SPEAKER_01: 这问题问得好。 那我在想……

[2846.620-2852.564] SPEAKER_02: 可以做个个性化处理。 比如聊到头发时, 可以用用户画像。 这样他说“哈利”时, 因为他读过很多哈利·波特,

[2852.864-2863.324] SPEAKER_01: 就更可能是那个哈利。 但按我之前说的结果, 我只想尽量简单。 用户问哈利·波特,不是哈利·波特问。 哈利。 如果表示用户向量,

[2863.624-2871.065] SPEAKER_04: 再加入更多用户知识, 把上下文作为额外标记输入网络, 网络自己就能弄清楚。

[2871.365-2873.478] SPEAKER_01: 对,这是一种方法。 是的。

[2873.558-2875.229] SPEAKER_01: 好,我有个问题。

[2875.529-2885.211] SPEAKER_05: 你做过doc2vec的一些工作。 是的。你知道 应用情况怎么样? 是的,知道应用现状吗? 在推广word2vec到多词方面?

[2885.511-2895.193] SPEAKER_01: 哦,懂了。 我认为skip-thoughts方向有趣。 doc2vec是一种方法,但skip-thoughts也不错。 skip-thoughts这个想法是Russan Salakuzdinou的。

[2895.493-2906.708] SPEAKER_04: 他研究这个,思路是用序列到序列。 预测下一个句子,输入 就是当前句子 用前一句或后一句 然后训练这类模型 这个模型叫Skip Thought

[2906.788-2917.480] SPEAKER_04: Skip Thoughts评价很好 取末尾的嵌入 再去做文档分类 效果很好 这可能是个方向 我Google同事在研究一种叫 Autoencoder

[2917.780-2923.770] SPEAKER_01: 不是预测下一个句子 它预测当前句子 就是重复当前句子 效果也不错 嗯

[2924.070-2928.179] SPEAKER_05: 嗯 你觉得解决常识推理 问题的方法呢

[2928.479-2934.400] SPEAKER_01: 哦,常识? 我对常识很感兴趣。 可我完全不知道。 也许可以这么做。 常识涉及很多。

[2934.700-2942.919] SPEAKER_04: 首先,世界知识很多。 文本没记下这些知识。 比如重力这类。 所以可能需要实际结合。 多模态。 这是一种思路。

[2943.219-2949.685] SPEAKER_01: 关键是让无监督学习管用。 这是另一种办法。 不过这个领域,我也就是在猜。 就在猜而已。

[2949.985-2953.154] SPEAKER_05: 有没有好办法表示所有规则? 再用个软件?

[2953.454-2956.426] SPEAKER_01: 对对对。 问题是怎么表示规则?

[2956.726-2967.465] SPEAKER_04: 所以如果看这个网络,神经程序员… 网络实际上增强了 通过加法和减法,这些就是规则。 你可以用规则表增强它。 然后问网络。

[2967.545-2970.331] SPEAKER_04: 其实要关注那个规则表。

[2970.631-2974.079] SPEAKER_01: 大家已经研究了这个方向。 这是一种方法。

[2974.379-2977.513] SPEAKER_05: 好的,你的意思是, 增强它来做逻辑推理?

[2977.813-2979.624] SPEAKER_01: 对对对。

[2979.924-2992.372] SPEAKER_05: 嘿,讲得很好。 嗯,谢谢。 有没有实用的经验法则? 需要多少序列对训练这种模型? 才能成功? 有没有什么技巧减少所需序列对数量? 如果你没有初始数据呢?

[2992.672-3004.017] SPEAKER_01: 通常数据集越大越好。 但训练翻译用的语料库, 比如英译德,它 大概只有三到五百万个句子对 或者差不多这样。 所以只有三百万,有点小,对吧?

[3004.097-3011.678] SPEAKER_01: 不过大家还是能达到最好水平。 这很鼓舞人心。 如果你连大量数据都没有, 那我会说像预训练这种方法,

[3011.978-3023.657] SPEAKER_04: 用语言模型或Word2Vec训练词向量。 这个领域参数很多。 可以用某种语言模型来预训练模型, 然后减少softmax。 这也是参数很多的领域。

[3023.737-3033.454] SPEAKER_04: 或者在输入嵌入里加dropout, 或者随机丢掉句子中的一些词。 这些方法能改善正则化, 当你没有大量数据时。

[3033.754-3036.807] SPEAKER_01: 好的。 好的,谢谢。 好的。 好的,谢谢。

[3037.107-3042.296] SPEAKER_05: 谢了,郭。 六点集合,去Yoshua Ben-Jo的闭幕。 主题演讲环节。