注意假装和在Keras中的实施

关于俄语中有关人工智能的文章


尽管英语文献中已经描述了注意力机制,但我仍未在俄语国家中对该技术进行过恰当的描述。 我们的语言中有很多关于人工智能(AI)的文章。 但是,发现的那些文章仅揭示了最简单的AI模型,例如卷积网络,生成网络。 但是,根据AI领域的最新发展,俄语领域几乎没有文章。

当我进入主题,研究AI领域的当前状况时,缺少有关最新进展的俄语文章成为我的问题。 我精通英语,我阅读了有关AI主题的英文文章。 但是,当出现新的概念或新的AI原理时,用外语来理解它是痛苦而漫长的。 懂英语,能将非母语的人渗透到复杂的对象中仍然值得花费更多的时间和精力。 阅读说明后,您会问自己一个问题:您了解百分之几? 如果有一篇俄语文章,那么一读之后,我会100%理解。 生成网络发生了这种情况,针对该网络有一系列精彩的文章:阅读后一切变得清晰。 但是在网络世界中,有许多方法仅用英语描述,并且不得不处理数天。

我将定期用我的母语撰写文章,将知识带入我们的语言领域。 如您所知,理解主题的最佳方法是向某人解释。 因此,除了我之外,还有谁应该发表关于最现代,最复杂,最先进的建筑AI的系列文章。 到本文结尾,我本人将理解100%的方法,这对阅读并提高理解水平的人很有用(顺便说一句,我爱Gesser,但更好的** Blanche de bruxelles **)。

当您理解主题时,有4个理解级别:

  1. 您了解算法/级别的原理以及输入和输出
  2. 您了解聚会出口,并大致了解其运作方式
  3. 您了解了以上所有内容以及每个网络级别的设备(例如,在VAE模型中,您了解了原理,并且还了解了重新参数化技巧的本质)
  4. 我了解了所有内容,包括每个级别,也了解了所有内容的学习原因,同时我能够为任务选择超级参数,而不是复制粘贴现成的解决方案。

对于新架构,从第1级到第4级的过渡通常很困难:作者强调说,他们更接近地从表面上描述了各种重要细节(他们自己理解吗?)。 或您的大脑不包含任何结构,因此即使阅读了说明,它也没有破译,也没有变成技巧。 发生这种情况的原因是,在您的学生期间,您在晚上的派对之后睡了相同的matan课,您给了正确的垫子。 仪器。 在这里,我们需要使用母语的文章来揭示每个操作的细微差别和微妙之处。

注意概念及应用


以上是理解水平的方案。 为了解析注意力,让我们从第一级开始。 在描述输入和输出之前,我们将分析其实质:这个概念基于哪些基本概念,即使对于儿童也可以理解。 在本文中,我们将使用英文术语Attention,因为在这种形式下,它也是对Keras库函数的调用(它不是直接在其中实现的,因此需要一个附加模块,但下面还有更多模块)。 要进一步阅读,您必须了解Keras和python库,因为将提供源代码。

注意从英语翻译为“注意”。 这个术语正确地描述了这种方法的本质:如果您是驾车者,并且照片中显示了交警大将,则无论其背景如何,您都会直观地重视它。 您可能会仔细研究一般情况。 您睁大眼睛,仔细看一下肩带:他在那里有多少颗星星。 如果将军不是很高,请忽略他。 否则,将其视为做出决策的关键因素。 这就是我们大脑的工作方式。 在俄罗斯文化中,我们经过了几代人的训练,以注意高等级,我们的大脑自动将此类物品放在首位。

注意是一种告诉网络您应该更多注意的方法,即根据神经元的状态和输入数据来报告特定结果的可能性。 Keras本身实现的Attention层会根据训练集识别因素,将注意力集中在这些因素上,可以减少网络错误。 重要因素的识别是通过误差的反向传播方法进行的,类似于对卷积网络进行的方法。

在训练中,注意力表明了其概率性质。 该机制本身形成重要性等级的矩阵。 如果我们没有培训注意力,那么我们可以例如根据经验来确定重要性(将军比少尉更重要)。 但是,当我们在网络上训练数据时,重要性取决于特定结果概率的函数,具体取决于在网络输入端接收到的数据。 例如,如果我们在俄国沙皇遇到一个普通的人,那么获得手套的可能性就很高。 确定这一点之后,有可能通过几次个人会议来收集统计数据。 在那之后,我们的大脑将适当地重视此主题的召开,并在肩带和条纹上放置标记。 应该注意的是,设置标记不太可能:现在的大会将给您带来完全不同的后果,此外,权重可能还不止一个。 但是,可以通过将其标准化来将权重降低为概率。

注意机制在学习中的概率性质体现在机器翻译任务中。 例如,让我们通知网络,从俄语翻译成英语时,“爱”一词在90%的情况下被翻译为“爱”,在9%的情况下被翻译为“性”,否则在1%的情况下被翻译。 该网络会立即标记许多选项,显示出最佳的培训质量。 翻译时,我们告诉网络:“翻译“爱”一词时,请特别注意英文单词“爱”,并查看它是否仍然可以是“性”。

注意方法适用于处理文本以及声音和时间序列。 对于文本处理,递归神经网络(RNN,LSTM,GRU)被广泛使用。 注意可以补充或替换它们,从而将网络转移到更简单,更快速的体系结构中。

Attention最著名的应用之一是它的用途是放弃递归网络并转移到完全连接的模型。 递归网络有一系列缺点:无法在GPU上提供训练,快速的再训练。 使用Attention机制,我们可以构建一个能够在完全连接的网络的基础上学习序列的网络,在GPU上进行训练,并使用droput。

注意被广泛用于提高递归网络的性能,例如,在从一种语言到另一种语言的翻译领域。 使用现代AI中经常使用的编码/解码方法时(例如,可变自动编码器)。 在编码器和解码器之间添加Attention层时,网络操作的结果将显着改善。

在本文中,我不会使用Attention引用特定的网络体系结构;这将是单独工作的主题。 值得一提的是,列出了所有可能的注意力用途。

开箱即用地实现注意


当您了解哪种方法时,学习基本原理将非常有用。 但是,通常只有通过查看技术实施方案才能充分理解。 您将看到组成操作功能的数据流,可以清楚地计算出确切的内容。 但是首先,您需要运行它并编写“ Attention hello word”。

目前Keras本身尚未实现注意。 但是已经有第三方实现,例如attention-keras,可以与github一起安装。 然后您的代码将变得非常简单:

from attention_keras.layers.attention import AttentionLayer attn_layer = AttentionLayer(name='attention_layer') attn_out, attn_states = attn_layer([encoder_outputs, decoder_outputs]) 

此实现支持Attention标尺可视化功能。 经过培训的注意力,您可以获得矩阵信号,根据网络,这对于这种类型尤为重要(来自github上的图片来自tention-keras库页面)。


基本上,您不需要任何其他操作:将此代码作为网络级别之一包含在网络中,并乐于学习网络。 在概念的第一阶段(顺便说一下,就像数据库一样),在第一阶段设计任何网络,任何算法,然后在实现之前以逻辑和物理表示形式指定实现。 这种设计方法尚未开发用于神经网络(哦,是的,这将是我的下一篇文章的主题)。 您不了解卷积层在内部如何工作? 描述了原理,您可以使用它们。

Keras实施Attention low


为了最终理解该主题,下面我们将详细分析“注意”的实现。 这个概念很好,但是它到底是如何工作的,为什么为什么要完全按规定获得结果呢?

在Keras中,Attention机制的最简单实现仅需3行:

 inputs = Input(shape=(input_dims,)) attention_probs = Dense(input_dims, activation='softmax', name='attention_probs')(inputs) attention_mul = merge([inputs, attention_probs], output_shape=32, name='attention_mul', mode='mul' 

在这种情况下,输入层在第一行中声明,然后进入具有softmax激活函数的完全连接层,其中神经元数量等于第一层中的元素数量。 第三层将完全连接层的结果与输入数据逐个元素相乘。

下面是整个Attention类,该类实现了稍微复杂一些的自我注意机制,可以将其用作模型中的完整级别;该类继承了Keras层类。

 # Attention class Attention(Layer): def __init__(self, step_dim, W_regularizer=None, b_regularizer=None, W_constraint=None, b_constraint=None, bias=True, **kwargs): self.supports_masking = True self.init = initializers.get('glorot_uniform') self.W_regularizer = regularizers.get(W_regularizer) self.b_regularizer = regularizers.get(b_regularizer) self.W_constraint = constraints.get(W_constraint) self.b_constraint = constraints.get(b_constraint) self.bias = bias self.step_dim = step_dim self.features_dim = 0 super(Attention, self).__init__(**kwargs) def build(self, input_shape): assert len(input_shape) == 3 self.W = self.add_weight((input_shape[-1],), initializer=self.init, name='{}_W'.format(self.name), regularizer=self.W_regularizer, constraint=self.W_constraint) self.features_dim = input_shape[-1] if self.bias: self.b = self.add_weight((input_shape[1],), initializer='zero', name='{}_b'.format(self.name), regularizer=self.b_regularizer, constraint=self.b_constraint) else: self.b = None self.built = True def compute_mask(self, input, input_mask=None): return None def call(self, x, mask=None): features_dim = self.features_dim step_dim = self.step_dim eij = K.reshape(K.dot(K.reshape(x, (-1, features_dim)), K.reshape(self.W, (features_dim, 1))), (-1, step_dim)) if self.bias: eij += self.b eij = K.tanh(eij) a = K.exp(eij) if mask is not None: a *= K.cast(mask, K.floatx()) a /= K.cast(K.sum(a, axis=1, keepdims=True) + K.epsilon(), K.floatx()) a = K.expand_dims(a) weighted_input = x * a return K.sum(weighted_input, axis=1) def compute_output_shape(self, input_shape): return input_shape[0], self.features_dim 

在这里,我们看到的是与上面通过完全连接的Keras层实现的大致相同的东西,只是通过较低级别的更深层逻辑来执行。 在函数中创建一个参数级(self.W),然后将其与输入矢量标量乘以(K.dot)。 此变体中的有线逻辑稍微复杂一点:将偏移量(如果公开了偏置参数),双曲正切,曝光,遮罩(如果指定),归一化应用于输入向量乘以self.W,然后再次对输入向量进行加权获得的结果。 我没有描述此示例中规定的逻辑;我重现了读取代码的操作。 顺便说一句,如果您认识到这种逻辑中的某种数学高级功能,请在注释中写出。

该类具有参数“ bias”,即 偏见。 如果激活了该参数,则在应用密集层之后,将最终向量添加到“ self.b”层参数的向量中,这不仅使确定我们的注意力功能的“权重”成为可能,而且还可以将注意力水平移动一个数字。 人生榜样:我们害怕鬼魂,但从未遇见过它们。 因此,我们对-100点进行了更正。 就是说,只有当恐惧超过了100分时,我们才会做出防范鬼的决策,致电幽灵破坏机构,购买驱逐装置等。

结论


注意机制具有变化。 上面的类中实现的最简单的Attention选项称为Self-Attention。 自我关注是一种旨在处理顺序数据的机制,同时考虑到每个时间戳的上下文。 它最常用于处理文本信息。 可以通过导入keras-self-attention库来直接使用self-attention实现。 注意还有其他变化。 通过学习英语材料,可以计算出5种以上的变体。

即使撰写这篇相对简短的文章,我也研究了十多篇英语文章。 当然,我无法将所有这些文章中的所有数据下载到5页中,我只是为了创建一个“虚拟人指南”而进行了挤压。 要了解Attention机制的所有细微差别,您需要一本150-200页的书。 我真的希望我能够揭示这种机制的基本本质,以便那些刚开始了解机器学习的人了解这一切的原理。

资料来源


  1. Keras神经网络中的注意力机制
  2. Keras对深度网络的关注
  3. Keras中基于注意力的序列到序列
  4. Keras中使用注意力机制的文本分类
  5. 普遍关注:2D卷积神经网络用于序列到序列的预测
  6. 如何在Keras中实现注意力层?
  7. 注意吗 注意!
  8. 注意的神经机器翻译

Source: https://habr.com/ru/post/zh-CN458992/


All Articles