前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >扔掉代码表!用RNN“破解”摩斯电码

扔掉代码表!用RNN“破解”摩斯电码

作者头像
刀刀老高
发布2018-04-10 17:43:50
1.7K0
发布2018-04-10 17:43:50
举报
文章被收录于专栏:奇点大数据奇点大数据

作者:Sandeep Bhupatiraju

剧透警告:摩斯电码并不需要破解。它很有用,因为消息可以使用这些代码以最少的设备发送,并且我说它不需要破解,因为代码是众所周知的,点和破折号的组合并不是什么秘密。但是,从理论上讲,它是一种替代密码(substitution cipher), ‍每个字母(和每个数字)的每个字母都有一些使用点和破折号的表示形式,如下所示。

让我们暂停我们的怀疑,并假设我们收到摩尔斯电码的消息,但我们不知道如何阅读它们。假设我们还有一些代码的例子及其相应的单词列表。现在,我们可以猜测它是一个替代密码,然后最终找出每个字母表的代码; 从而解码消息。

或者,我们可以构建一个 encoder-decoder 模型 来猜测(几乎)所有的单词!作为受虐狂,我们当然会选择后者。照这样说,让我们猛拍一下堂·吉诃德的战马 Rocinante,开始大战风车的征程。

这是目前的问题; 我们有几个编码序列及对应的可理解的例子。使用这些例子,我们必须学习一些模式,并使用这些信息来预测新的编码标记(单词)可能会是什么。与我们预测数值结果的常见回归问题不同,我们手头有一些序列到序列(sequence-to-sequence)的学习问题,在数据中有时间结构。这是递归神经网络(RNN)可能有用的一个即时提示(它用于语音和语音数据的 RNN,以及用于图像数据的 CNN 和用于图像字母的 RNN 组合)。粗略地说,这属于一类问题:也包含了机器翻译的问题;这个模型的结构在这里起到了启发的作用。有关此主题的更多信息请参阅 [1]。限于篇幅我们不会赘述 RNN 的理论,但对于这个主题的简要介绍请参考文献 [2] 的一系列文章。

对于那些想知道这个问题能否以不同方式解决的人,是的,马尔科夫连锁蒙特卡洛会努力获得类似的结果。在那种情况下,我们将遵循优秀论文[3]中第一个例子中提到的程序。

大概的概念

粗略地说,我们想从 (x_1,...,x_n) 输入序列预测输出序列 (y_1,...,y_m),这就涉及了条件概率(conditional probability)的学习。

这里的一个主要障碍是预测可变尺寸输入的可变尺寸输出。在元层次上,这是通过组合两个RNN来克服的,其中第一个RNN将可变尺寸输入映射到固定长度输出,另一个接收固定长度输入并返回可变长度输出。称为上下文向量的固定长度中间媒介矢量封装来自输入序列的信息,该输入序列一次馈送一个字符。产生上下文向量的机制是使得RNN对捕获时间结构有用 - 上下文向量是最终时间步之后的RNN的隐藏状态或其一些功能。上述条件概率是使用链式规则计算的。

其中h是上下文向量。最后,可以使用softmax函数计算上述等式中右边的条件概率,该函数将字符y_ {i-1},...,y_1的单热编码矢量作为输入,递归层的输出第二RNN和上下文向量。这里使用的RNN的具体类型是LSTM,它有效地克服了简单RNN的局限性,该简单RNN遭受渐变消失问题的困扰,并且更好地捕获远距离依赖性。

数据准备

我们将引入一个特殊字符(*)来表示每个字母的代码之间的空格。例如,SOS的代码将由''表示。。。* - - - *。。“。(代替 '。 。 。 - - - 。 。 。')。我们这样做是为了确保与给定代码相对应的单词是唯一的。接下来,而不是产生的字母作为我们数据字随机集合,我们将使用英语单词从编制的数据集(words_alpha)这里。要了解数据,请考虑下面给出的字长的直方图。从直方图可以看出,长词的长度(长度大于5)比短的多。

对包含长编码词的数据进行训练的网络倾向于平均预测长词。请记住,网络不会找出产生数据的'公式',也就是说,它不会学习图1中的图表。

我们开始数据准备工作,构建一个函数,将所输入的英文单词编码为它的 Morse 电码并输出。

为了说明的目的,我们将从给定的固定长度的单词中产生训练和验证数据。这里我们将这个长度固定为9,因为长度9的字数足够大(参考上面的直方图)。

请注意,这意味着来自网络的输出字将具有固定长度,但输入的莫尔斯码不会全部具有相同的长度。我们采取的另一个自由是我们假设我们知道每个字母表都是由长度最长为4的字符串编码的(我们不需要做这个具体的假设,我们可以选择训练数据中最长莫尔斯码的长度作为接下来的max_length_x值)。所以如果这个词如果长度为n那么对应于它的莫尔斯电码的长度至多为4n +(n-1),其中n-1项对应于* s的数量。我们用左边的空格填充代码以使它们长度相同,这意味着我们的输入字符词汇表是{'。',' - ','*',''},为了一般性,我们让字符输出词汇是所有字母和白色空间的特殊字符。

回到关于网络猜测长单词的评论,我们的意思是,由于长单词的数量会造成不平衡,因此网络将会倾向于猜测更少的空格。在下面的代码片段中,output_list 将包含英文单词,input_list 将包含填充的 Morse 电码。

现在,我们构建输入中字符的一个独热编码矢量,使输入数据适合神经网络。为此,我们构建了一个类对象(类似于 Keras 文档中的例子),它将有助于编码和解码,并将 Morse 电码和英语单词解码。我们将类分配给具有适当字符集的对象。

拆分数据以产生训练集x_train,y_train,从整个数据集x,y的四分之一开始,并且我们将保留剩余的四分之三作为验证集x_val,y_val。请注意,理想情况下,我们应该将部分训练集作为我们的验证集,其余部分作为我们的测试集,但考虑到我们的玩具设置,我们比参数调整对模型构建更感兴趣。我们现在已经准备好了我们的培训和测试(验证)数据,并可以继续对网络进行修改。

构建神经网络的最简单方法是使用Keras模型和顺序API。由于我们不需要TensorFlow的全部功能和灵活性,所以我们坚持Keras。

模型结构 (Encoder-Decoder 模型)

我们选择的模型拓扑结合了简单RNN的强大变体,称为长期短期记忆(LSTM)网络。

第一个LSTM将作为编码器,接受一个可变长度的输入序列,一次一个字符,并将其转换为固定长度的内部潜在表示。另一个LSTM将作为一个解码器,将潜在表示作为输入,并将其输出传递到一个密集层,该层使用softmax函数来一次预测一个字符。

该模型的编码器和解码器组件可能具有多层LSTM,并且其先前通常不清楚哪种拓扑将最佳工作。对于机器翻译而言,深层网络通常会更好地工作。作为一个经验法则,我们期望堆叠层能够学习更高层次的时间表示,因此当数据具有一些层次结构时我们使用它。对于我们来说,每一层就足够了。

该模型使用Sequential()构造,并且每次添加一个图层。第一个LSTM层将3D张量作为输入,并要求用户指定输入尺寸。这可以用代码中指定的input_shape简洁地完成,其中第一个组件代表时间步数,第二个组件代表特征数。对于我们来说,特征的数量是输入序列词汇表中的元素数量,即4,因为我们有'。',' - ','*'和空白字符''。

由于我们一次只输入一个热点编码矢量,因此时间步数为max_len_x。我们还将指定图层中的存储单元(或块)的数量(在此由latent_dim参数表示,我们使用256),这是潜在表示的维度。请注意,我们想要将LSTM的最终隐藏状态作为潜在表示返回,这将具有来自所有时间步骤的信息,即完整的输入序列。如果我们使用了return_sequences = true选项,我们将得到每个时间步的隐藏状态输出,但是只包含到该步骤的序列信息。

这就结束了简单的编码器模型。接下来我们构建一个与我们的解码器类似的层 但是,上面的代码片段的输出将是一个2D数组。我们使用方便的RepeatVector图层重复这个输出max_len_y nunber次并将它用作我们下一个LSTM图层(解码器)的输入,将其转换为3D张量。现在,我们在这个LSTM中使用return_sequences = True选项来输出隐藏状态的序列,我们需要使用这些信息来做出预测。为此,我们使用TimeDistributed致密层输出一个长度为max_len_y的向量,通过它我们可以使用softmax激活函数来选择最可能的字母。

为了快速了解 TimeDistributed 层的目的,请参阅 Jason Brownlee 撰写的博文:How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python。

https://machinelearningmastery.com/timedistributed-layer-for-long-short-term-memory-networks-in-python/

以下是对网络和各种输入和输出尺寸的简要总结。

我们将模型拟合到数据上,在集合x_train,y_train上进行训练,并使用x_val和y_val来看看我们已经完成了多少。我们需要设置的最后一组参数是时期数和批量大小。批量大小是在梯度下降算法中通过网络传递的训练集的部分的大小,之后对网络中的权重进行更新。通常批量大小设置为您的计算机内存可以处理的最大值。一个时代是通过使用这些批次的训练数据全面运行。在这里,我们设置1024的批处理大小并使用120个时期,并且在下面的图中可以看出,在大约100个时期之后,精度没有可观的增益。一般来说,看看哪些参数起作用是一个试验和错误的问题。我们现在使用fit()方法来拟合模型。

最后,从上面的图可以看出,我们可以在验证集上得到大约93%的准确度,这并不差。当然,如果我们增加训练数据的大小,我们可以做得更好。以下是对一组随机选择的单词的一些预测。

在左边输入代码,中间输入相应的单词,右边输入预测。如果预测正确,那么该单词为绿色,否则为红色。

正如你所看到的,错误的预测也不算太坏。我们必须提醒自己,破译密码并没有破解代码,也就是说,弄清楚每个字母代表什么。事实上,我们可以输入字母的代码,并查看网络预测的单个字母的代码,如下所示,我们离目标还很远!

作为 encoder-decoder 模型的另一个例子,你可以尝试使用凯撒加密(Caesar cipher)或者其他代码来查看这种方法的有效性如何。

References:

[1] Sequence to Sequence Learningwith Neural Networks

http://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf

[2] Understanding LSTM Networks

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

[3] THE MARKOV CHAIN MONTE CARLO REVOLUTION

http://www.ams.org/journals/bull/2009-46-02/S0273-0979-08-01238-X/S0273-0979-08-01238-X.pdf


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大概的概念
  • 数据准备
  • 模型结构 (Encoder-Decoder 模型)
相关产品与服务
机器翻译
机器翻译(Tencent Machine Translation,TMT)结合了神经机器翻译和统计机器翻译的优点,从大规模双语语料库自动学习翻译知识,实现从源语言文本到目标语言文本的自动翻译,目前可支持十余种语言的互译。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档