<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>深度学习 on Brook&#39;Log</title>
    <link>https://brookwillow.github.io/tags/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/</link>
    <description>Recent content in 深度学习 on Brook&#39;Log</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Sat, 01 Apr 2023 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://brookwillow.github.io/tags/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>神经网络中的记忆问题</title>
      <link>https://brookwillow.github.io/posts/memory-in-deep-learning/</link>
      <pubDate>Sat, 01 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://brookwillow.github.io/posts/memory-in-deep-learning/</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;注：此文为我个人的胡思乱想，并没有严谨的学术论文进行佐证&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;memory-is-all-you-need&#34;&gt;Memory is all you need&lt;/h2&gt;
&lt;p&gt;使用这个副标题是借用 transformer 论文中的 &amp;ldquo;Attention is all you need&amp;rdquo;，虽然记忆不是神经网络中的必要的部分，却是进行序列处理时的必要的部分&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em><strong>注：此文为我个人的胡思乱想，并没有严谨的学术论文进行佐证</strong></em></p>
<h2 id="memory-is-all-you-need">Memory is all you need</h2>
<p>使用这个副标题是借用 transformer 论文中的 &ldquo;Attention is all you need&rdquo;，虽然记忆不是神经网络中的必要的部分，却是进行序列处理时的必要的部分</p>
<p>没有记忆，神经网络便没有能力处理序列问题</p>
<p>而序列的处理是当前很多现实问题或者稍微复杂的问题中无法避免的</p>
<p>再聪明的头脑和性能再好的计算机，如果没有记忆，则一无是处</p>
<h2 id="记忆">记忆</h2>
<p>中文中记忆非常形象化的描述了这个过程，即</p>
<p><strong>先记，然后忆</strong></p>
<p>记是一个输入信息 (x) 的过程，忆是一个结合这部分信息 (x) 进行输出的过程，两者的物理上的关联便是这部分信息 (x)，&ldquo;然后&rdquo; 又说明了他们在时间纬度上的先后顺序</p>
<p>因此我们此处所讨论的<strong>记忆，一定是存在先后顺序的序列上的时序问题，而非普通的关联</strong></p>
<p>这很重要，因为由特征作为输入的普通的神经网络单元之间亦有不同程度的关联，但这并不是记忆</p>
<h2 id="电脑存储和神经网络的记忆">电脑存储和神经网络的记忆</h2>
<h3 id="电脑存储">电脑存储</h3>
<p>信息储存在固定的位置，CPU 按照 <strong>地址-数据</strong> 映射关系进行存取</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled.png"></p>
<h3 id="人脑的记忆">人脑的记忆</h3>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_1.png"></p>
<p>显然，大脑的记忆结构与计算机的存储方式是不同的，大脑中不存在一个区域用来将信息以某种方式固定下来，等待需要的时候按需访问</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_2.png"></p>
<p>整个大脑皮层是由几十万亿的神经元链接成的神经网络</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_3.png"></p>
<p>放大来看是树突加轴突组成，中间传导的是生物电流</p>
<h3 id="神经网络中的记忆">神经网络中的记忆</h3>
<h4 id="人工神经元">人工神经元</h4>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_4.png"></p>
<h4 id="神经网络">神经网络</h4>
<p>由多个神经元组成的网络，即为神经网络</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_5.png"></p>
<p>我们可以根据上述的简单的神经网络假定一种适合的任务：</p>
<p><strong>给定一个单词，判断这个单词是否是敏感词</strong></p>
<p>传入层传入的是单词经过处理后的表征向量，输出布尔类型</p>
<h2 id="rnn">RNN</h2>
<p>普通的前馈神经网络，其中激活仅在一个方向上流动，从输入层流向输出层</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_6.png"></p>
<h3 id="普通前馈神经网络的局限">普通前馈神经网络的局限</h3>
<p>普通前馈神经网络只能处理<strong>独立</strong>的输入数据，而<strong>时序数据具有依赖关系</strong>，即当前时刻的输出依赖于之前时刻的输出。例如，在自然语言处理中，一个句子的语义不仅取决于当前词的含义，还取决于之前词的含义</p>
<p>例如，英语单词 &ldquo;can&rdquo; 可以翻译成 &ldquo;可以&rdquo;、&ldquo;罐子&rdquo;、&ldquo;能够&rdquo; 等多个意思。如果没有上下文关联，机器翻译无法确定哪个翻译是正确的。在普通前馈神经网络中，&ldquo;I can open the can&rdquo; 可能会被翻译成 &ldquo;我 可以 打开 这个 可以&rdquo;</p>
<p>普通的前馈神经网络因为没有<strong>记忆</strong>，无法有效的利用前后时序信息，导致在某些时序任务上无法实现理想的效果</p>
<h3 id="rnn-的记忆机制">RNN 的记忆机制</h3>
<p>RNN 则通过<strong>记忆</strong>之前时刻的信息来解决时序依赖问题。具体来说，RNN 在每个时间步都会将前一个时间步的隐藏状态作为输入，与当前时间步的输入一起计算当前时间步的输出和隐藏状态</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_7.png"></p>
<p>RNN 可以解决的<strong>其他问题</strong>包括：</p>
<ul>
<li>语音识别</li>
<li>手写体识别</li>
<li>时间序列预测</li>
</ul>
<h2 id="lstm--gru">LSTM &amp; GRU</h2>
<p>由于数据在遍历 RNN 时会经过转换，因此在每个时间步长都会丢失一些信息。一段时间后，RNN 的状态几乎没有任何最初输入的痕迹</p>
<p>另外，<strong>RNN</strong> 容易出现<strong>梯度消失</strong>和<strong>梯度爆炸</strong>问题，这使得 RNN 在训练时很难收敛。为了解决这些问题，人们提出了<strong>长短时记忆网络 (LSTM)</strong> 和<strong>门控循环单元 (GRU)</strong> 等改进型 RNN</p>
<h3 id="lstm-的核心思想">LSTM 的核心思想</h3>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_8.png"></p>
<p>LSTM 新增一个 C(t) 来传递长期记忆，C(t) 流过每个 LSTM 单元时，删除一点不重要的记忆，然后新增一些该单元认为重要的记忆。这样的单元叫做长短期记忆单元</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_9.png"></p>
<p>使用 LSTM 构成的网络可以解决记忆的丢失问题，也可以有效地解决梯度消失和梯度爆炸问题</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_10.png"></p>
<h3 id="编码器-解码器网络-encoder-decoder">编码器-解码器网络 (Encoder-Decoder)</h3>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_11.png"></p>
<p>编码器-解码器网络是一种用于解决时序问题的深度学习模型。它由两个部分组成：编码器和解码器。编码器负责将输入序列编码成一个向量表示，解码器则负责将该向量表示解码成输出序列</p>
<p>在编码器-解码器网络中，记忆机制是解决时序问题的重要手段。记忆机制可以帮助模型记住输入序列中的信息，并在解码时使用这些信息生成输出序列</p>
<h2 id="注意力机制">注意力机制</h2>
<h3 id="为什么需要注意力">为什么需要注意力</h3>
<p>从单词 &ldquo;milk&rdquo; 到其翻译 &ldquo;lait&rdquo; 的路径：它非常长！这意味着这个单词的表征在实际使用之前需要进行许多步骤</p>
<p>C(t) 这个长期记忆经过不断的删减，保留到现在，当我当前作出决定时依赖这个 C(t) 是过去所有时间所有记忆的综合结果，我们无法得知和过去具体的哪个事件有关联，这样的记忆传导方式可能会导致传递的信息失去准确性，并带来了不可解释性</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_12.png"></p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_13.png"></p>
<h3 id="transformer">Transformer</h3>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_14.png"></p>
<p>左侧是 Encoder，右侧是 Decoder</p>
<p>Transformer 中的记忆的流动，关注三个点：</p>
<ul>
<li>Encoder 和 Decoder 自身中记忆如何关联和传递</li>
<li>Encoder 记忆和 Decoder 的记忆如何交互</li>
</ul>
<p>整个 Transformer 的输入是 Inputs，假设我们以一个机器翻译（英译中）的任务为例的话，inputs 就是英文中的一句话</p>
<p>经过 Embedding 嵌入得到一个词向量的矩阵</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_15.png"></p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_16.png"></p>
<h4 id="attention">Attention</h4>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_17.png"></p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_18.png"></p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_19.png"></p>
<h4 id="self-attention">Self-Attention</h4>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_20.png"></p>
<h3 id="multi-head-attention">Multi-Head Attention</h3>
<p><strong>模型在对当前位置的信息进行编码时，会过度的将注意力集中于自身的位置</strong>，因此作者提出了通过多头注意力机制来解决这一问题。同时，使用多头注意力机制还能够给予注意力层的输出包含有不同子空间中的编码表示信息，从而增强模型的表达能力</p>
<p>在传统的注意力机制中，模型通过计算查询（query）、键（key）和值（value）之间的关系来生成输出。而在多头注意力中，这个过程被扩展为多个并行的注意力层，每个层都有自己的查询、键和值。这些层被称为&quot;头&quot;（heads），每个头可以关注序列中不同位置的信息，并且可以学习到序列的不同方面的表示。</p>
<p>多头注意力的工作原理如下：</p>
<ol>
<li><strong>线性投影</strong>：首先，输入的查询、键和值通过不同的、学习得到的线性投影被转换到不同的表示空间，这些空间的维度通常较小，例如原始维度的 1/h，其中 h 是头的数量。</li>
<li><strong>并行注意力计算</strong>：每个头独立地应用标准的注意力机制（例如缩放点积注意力）来计算输出值。</li>
<li><strong>输出拼接</strong>：所有头的输出值被拼接在一起，并通过另一个线性投影生成最终的输出。</li>
</ol>
<p>多头注意力的优势在于它能够同时捕捉序列中不同位置的多种依赖关系，而不是像单头注意力那样只能捕捉到一种依赖关系。这使得模型能够更好地理解复杂的序列数据，并提高其在各种序列处理任务上的性能</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_21.png"></p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_22.png"></p>
<p>多头注意力机制其实就是将一个大的高维单头拆分成了多个头</p>
<p><img loading="lazy" src="/images/memory-in-deep-learning/Untitled_23.png"></p>
<h2 id="参考">参考</h2>
<p><a href="https://weread.qq.com/web/bookDetail/f6032780811e3728eg017bc2">https://weread.qq.com/web/bookDetail/f6032780811e3728eg017bc2</a></p>
<p><a href="https://weread.qq.com/web/bookDetail/c81324b0720befa3c81025e">https://weread.qq.com/web/bookDetail/c81324b0720befa3c81025e</a></p>
<p><a href="https://weread.qq.com/web/bookDetail/e8e327a07208f4d1e8ec475">https://weread.qq.com/web/bookDetail/e8e327a07208f4d1e8ec475</a></p>
<p><a href="https://arxiv.org/abs/2403.18839">https://arxiv.org/abs/2403.18839</a></p>
<p><a href="https://arxiv.org/abs/1706.03762">https://arxiv.org/abs/1706.03762</a></p>
<p><a href="https://www.ylkz.life/deeplearning/p10553832/">https://www.ylkz.life/deeplearning/p10553832/</a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
