循环神经网络(RNN)、长短时记忆网络(LSTM)及(GRU)模型

循环神经网络(RNN)

image.png 循环神经网络区别于其他神经网络在于循环二字,这里的循环是指隐含的输出(v)重新输入隐含权重参与模型训练,不同时刻的输入(X)也要放入隐含层权重中。隐含权重是循环到不同时间段其参数不一样,但隐含权重是共用的,注意在图中unfold下隐含权重矩阵只是一个矩阵(这里稍后解释:隐含的输出(v)和对应的输入(x)怎样共用一个矩阵),之所以呈现多个是为了对应不同的时刻。

在继续往下叙述之前,有一个优化问题要解决,即共用一个矩阵,这里可以通用一个简单的例子进行说明: 为方便理解,隐含变量为二维,输入的为一维,目的是得到新的隐含输入即二维。 image.png 我们可以发现,权重系数并排综合到一起,得到结果同样。这就提高了并行处理能力。

RNN源代码实现

java
复制代码
import torch.nn as nn

class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNN, self).__init__()

        self.hidden_size = hidden_size

        self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
        self.i2o = nn.Linear(input_size + hidden_size, output_size)
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, input, hidden):
        combined = torch.cat((input, hidden), 1)
        hidden = self.i2h(combined)
        output = self.i2o(combined)
        output = self.softmax(output)
        return output, hidden

    def initHidden(self):
        return torch.zeros(1, self.hidden_size)

循环神经网络的特点是每次的输入都有上一刻隐含层信息的参与,但也仅仅是上一刻,若神经网络输入不仅仅和上一刻时间的信息有关,换句话说,此刻时间的所需要训练的模型与很久之前信息也有关联,怎么让其参与进来?这就需要引入长短时记忆网络(LSTM),不过在谈论该模型之前,先研究再此基础上改进后发表的paper即GRU模型,该篇相比于LSTM模型更加容易理解。

GRU模型

GRU模型需要注意的是门控的作用,更确定说是在公式中作为权重的体现或者说是mask的效果。话不多说,理解这四个公式就理解了GRU模型,这样在看图就更加容易理解。

Rt=σ(XtWxr+Ht−1Whr+br)Zt=σ(XtWxz+Ht−1Whz+bz)R_t = \sigma(X_tW_{xr}+H_{t-1}W_{hr}+b_r)\ Z_t = \sigma(X_tW_{xz}+H_{t-1}W_{hz}+b_z)Rt​=σ(Xt​Wxr​+Ht−1​Whr​+br​)Zt​=σ(Xt​Wxz​+Ht−1​Whz​+bz​)

其中RtR_tRt​称为重置门,它有助于捕捉时序数据中短期的依赖关系,ZtZ_tZt​称为更新门,有助于捕捉时序数据中长期的依赖关系。其作用会在下面公式具体体现。

Ht~=tanh(XtWxh+Rt⊙Ht−1Whh+bn)\tilde{H_{t}}=tanh(X_t W_{xh} + R_t \odot H_{t-1} W_{hh} + b_n)Ht​~​=tanh(Xt​Wxh​+Rt​⊙Ht−1​Whh​+bn​)

Ht\tilde{H_{t}}Ht​​我们称作候选隐含状态,主要保存短期记忆。之所以重置门可以有助于捕捉时序数据中的短期依赖关系是因为其作用于上一个隐含状态通过pair-wise相乘。我们可以决定上一个时刻隐含状态我们要到底保留多少,RtR_tRt​某一维度对应的数值越大,即上一个隐含状态在该维度上保留的信息越多.

Ht=Zt⊙Ht−1+(1−Zt)⊙Ht~H_t = Z_t \odot H_{t-1} + (1-Z_t)\odot \tilde{H_{t}}Ht​=Zt​⊙Ht−1​+(1−Zt​)⊙Ht​~​

在公式中,ZtZ_tZt​作为更新门,我们不妨举个极端的例子,在这一时刻ZtZ_tZt​为1,那么上一个时刻信息是不是保存了,相对应的短期记忆的候选状态就为零了。同理,我们继续往前递推,在上一个时刻时,ZtZ_tZt​为1,那么上上时刻信息是不是保存了,相对应的短期记忆的候选状态也为零了。这样我们就可以保存到很久很久之前的信息,所以更新门有助于捕捉时序数据中长期的依赖关系。

那么下面这张图片就好理解了。

image.png

源代码实现

python
复制代码
class GRUCell(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(GRUCell, self).__init__()
        self.hidden_size = hidden_size
        self.gate = nn.Linear(input_size + hidden_size, hidden_size)
        self.output = nn.Linear(hidden_size, output_size)
        self.sigmoid = nn.Sigmoid()
        self.tanh = nn.Tanh()
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, input, hidden):
        combined = torch.cat((input, hidden), 1)        
        z_gate = self.sigmoid(self.gate(combined))
        r_gate = self.sigmoid(self.gate(combined))
        combined01 = torch.cat((input, torch.mul(hidden,r_gate)), 1)  
        h1_state = self.tanh(self.gate(combined01))
        
        h_state = torch.add(torch.mul((1-z_gate), hidden), torch.mul(h1_state, z_gate))
        output = self.output(h_state)
        output = self.softmax(output)
        return output, h_state

    def initHidden(self):
        return torch.zeros(1, self.hidden_size)  

最后让我们来看看lstm到底有什么难理解的。

长短时记忆网络(lstm)

有了GRU模型的理解,我们可以直接通过公式理解lstm。

It=σ(XtWxi+Ht−1Whi+bi)Ft=σ(XtWxf+Ht−1Whf+bf)Ot=σ(XtWxo+Ht−1Who+bo)I_t = \sigma(X_tW_{xi}+H_{t-1}W_{hi}+b_i)\ F_t = \sigma(X_tW_{xf}+H_{t-1}W_{hf}+b_f)\ O_t = \sigma(X_tW_{xo}+H_{t-1}W_{ho}+b_o)\It​=σ(Xt​Wxi​+Ht−1​Whi​+bi​)Ft​=σ(Xt​Wxf​+Ht−1​Whf​+bf​)Ot​=σ(Xt​Wxo​+Ht−1​Who​+bo​)

其中ItI_tIt​、FtF_tFt​、OtO_tOt​分别为输入门、遗忘门、输出门。

Ct~=tanh(XtWxc+Ht−1Whc+bc)\tilde{C_{t}}=tanh(X_t W_{xc} + H_{t-1} W_{hc} + b_c)Ct​~​=tanh(Xt​Wxc​+Ht−1​Whc​+bc​)

Ct\tilde{C_{t}}Ct​​作为候选记忆细胞,主要用来保存短期记忆

Ct=Ft⊙Ct−1+It⊙Ct~C_{t}=F_t\odot C_{t-1} + I_t\odot \tilde{C_{t}}Ct​=Ft​⊙Ct−1​+It​⊙Ct​~​

CtC_{t}Ct​为当前记忆细胞,用ItI_tIt​、FtF_tFt​大小去衡量长期记忆和短期记忆孰多孰少。理解方式同GRU,只不过把ZtZ_tZt​和(1−Zt)(1-Z_t)(1−Zt​)更换成两个变量形式。

Ht=Ot⊙tanh(Ct)H_t = O_t \odot tanh(C_t)Ht​=Ot​⊙tanh(Ct​)

HtH_tHt​为当前隐含状态,其中OtO_tOt​取当前记忆细胞一部分到隐含状态,这一点与GRU不同,并不是所有的都到隐含层,这样更有效或更灵活的在隐含层的基础上去输出或传递到下一个隐含层。

我们再次来看图

image.png

源代码实现:

python
复制代码
import torch.nn as nn
import torch

class LSTMCell(nn.Module):
    def __init__(self, input_size, hidden_size, cell_size, output_size):
        super(LSTMCell, self).__init__()
        self.hidden_size = hidden_size
        self.cell_size = cell_size
        self.gate = nn.Linear(input_size + hidden_size, cell_size)
        self.output = nn.Linear(hidden_size, output_size)
        self.sigmoid = nn.Sigmoid()
        self.tanh = nn.Tanh()
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, input, hidden, cell):
        combined = torch.cat((input, hidden), 1)
        f_gate = self.sigmoid(self.gate(combined))
        i_gate = self.sigmoid(self.gate(combined))
        o_gate = self.sigmoid(self.gate(combined))
        z_state = self.tanh(self.gate(combined))
        cell = torch.add(torch.mul(cell, f_gate), torch.mul(z_state, i_gate))
        hidden = torch.mul(self.tanh(cell), o_gate)
        output = self.output(hidden)
        output = self.softmax(output)
        return output, hidden, cell

    def initHidden(self):
        return torch.zeros(1, self.hidden_size)

    def initCell(self):
        return torch.zeros(1, self.cell_size)

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取==🆓

在这里插入图片描述

  • 38
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值