机器学习中的神经网络重难点!纯干货(下篇)

 目录

长短时记忆网络

基本原理

一个示例

自注意力模型

基本原理

自注意力机制

具体步骤

一个案例

生成对抗网络

基本原理

一个案例

长短时记忆网络

LSTM就像一个有记忆的人,可以记住重要的信息并且忘记不重要的。

特别擅长处理长序列数据,因为它可以在很长的序列中捕捉和保持关键信息,而不会被无关信息淹没。

基本原理

LSTM的核心思想是细胞状态(cell state)和门(gates)的概念。细胞状态就像LSTM的记忆,它可以传递信息并在必要时保留或删除。

门用于控制信息的流动,包括遗忘不必要的信息和记住重要的信息。

LSTM的工作过程分为三个主要步骤:遗忘、存储和更新。

1、遗忘:细胞状态决定哪些信息应该被遗忘,哪些信息应该保留。门控制着遗忘的过程。

2、存储:新的信息被添加到细胞状态中,以更新记忆。门还可以控制信息的存储。

3、更新:基于当前的输入和细胞状态,LSTM生成新的输出和细胞状态,这将成为下一个时间步的输入。

一个示例

使用Python和TensorFlow来构建一个LSTM模型,并将其应用于文本生成。


import tensorflow as tf
import numpy as np

# 创建示例数据
text = "这是一个示例文本。LSTM将学会预测下一个字符。"
chars = sorted(list(set(text)))
char_to_index = {char: index for index, char in enumerate(chars)}
index_to_char = {index: char for index, char in enumerate(chars)}

# 准备数据
max_sequence_length = 100
sequences = []
next_chars = []
for i in range(0, len(text) - max_sequence_length, 1):
    sequences.append(text[i:i + max_sequence_length])
    next_chars.append(text[i + max_sequence_length])

X = np.zeros((len(sequences), max_sequence_length, len(chars)), dtype=np.bool)
y = np.zeros((len(sequences), len(chars)), dtype=np.bool)
for i, sequence in enumerate(sequences):
    for t, char in enumerate(sequence):
        X[i, t, char_to_index[char]] = 1
    y[i, char_to_index[next_chars[i]]] = 1

# 构建LSTM模型
model = tf.keras.Sequential([
    tf.keras.layers.LSTM(128, input_shape=(max_sequence_length, len(chars))),
    tf.keras.layers.Dense(len(chars), activation='softmax')
])

# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy')

# 训练模型
model.fit(X, y, epochs=100)

# 生成文本
seed_text = "这是一个示例文本。LSTM将学会预测下一个字符。"
generated_text = seed_text
for i in range(100):
    x = np.zeros((1, max_sequence_length, len(chars)))
    for t, char in enumerate(generated_text[-max_sequence_length:]):
        x[0, t, char_to_index[char]] = 1
    predicted_char = index_to_char[np.argmax(model.predict(x, verbose=0)]
    generated_text += predicted_char

代码中实现的是构建了一个LSTM模型,用于文本生成。模型学会了根据前面的文本生成后续文本,展示了LSTM如何捕捉文本中的序列信息。

自注意力模型

Transformer是一种能够理解文本和序列数据的神经网络模型。它的独特之处在于使用了自注意力机制,这意味着它能够同时关注输入数据中的不同部分,而不像传统的循环神经网络(RNN)或卷积神经网络(CNN)那样依赖于固定窗口大小或序列顺序。

Transformer的核心思想是将输入数据分为不同的“词嵌入”(word embeddings),然后使用自注意力机制来决定这些词嵌入之间的关联程度。这种方式使得模型可以处理长文本并捕捉到不同单词之间的复杂关系。

基本原理

自注意力机制

自注意力机制是Transformer的核心。它的思想是计算输入序列中每个位置对其他位置的重要性。这个重要性是通过计算一个权重值的方式来实现的,而这个权重值是根据输入的相似性来决定的。重要的是,这种计算是基于输入数据本身完成的,因此不受序列长度的限制。

具体步骤

1、嵌入层(Embedding Layer):将输入的文本序列转化为向量形式,每个词对应一个向量。这些向量被训练成具有语义信息的表示。

2、自注意力计算:对于每个词,计算它与所有其他词的相似性得分,然后将这些分数作为权重来加权其他词的嵌入向量。这个过程允许模型更关注与当前词相关的词。

3、多头自注意力:Transformer可以通过多个自注意力头来捕捉不同层次的关系,每个头都会生成一组权重,最后合并它们。

4、残差连接与层归一化:将多头自注意力的输出与输入相加,并应用层归一化,以防止梯度消失或爆炸。

5、前馈神经网络(Feed-Forward Network):对每个位置的向量进行非线性变换,以增强模型的表示能力。

6、编码器和解码器:在机器翻译等任务中,Transformer通常由编码器和解码器组成,它们分别用于处理输入和生成输出。

一个案例

首先,假设我们有一个文本分类任务,需要将文本句子分为正面和负面情感。

代码中,包括创建Transformer模型、输入数据和运行模型的步骤:

 
import torch
import torch.nn as nn

# 创建一个简化的Transformer模型类
class TransformerModel(nn.Module):
    def __init__(self, d_model, nhead, num_encoder_layers):
        super(TransformerModel, self).__init__()
        self.transformer = nn.Transformer(d_model, nhead, num_encoder_layers)
    
    def forward(self, src, tgt):
        output = self.transformer(src, tgt)
        return output

# 创建示例数据
# 假设我们有一个输入序列(src)和一个目标序列(tgt)
# 这里我们使用随机生成的数据,实际应用中应该替换为真实数据
src = torch.rand((10, 3, 512))  # 输入序列,形状:(sequence_length, batch_size, embedding_dim)
tgt = torch.rand((20, 3, 512))  # 目标序列,形状:(sequence_length, batch_size, embedding_dim)

# 初始化模型
model = TransformerModel(512, 8, 6)

# 运行模型
output = model(src, tgt)
print(output.shape)

在上述代码中:

1、我们创建了一个简化的Transformer模型(TransformerModel),它接受输入序列(src)和目标序列(tgt)。

2、我们使用torch.rand函数生成了随机的示例数据,其中src代表输入序列,tgt代表目标序列。这些数据应该由任务提供,实际应用中会更有意义。

3、我们初始化了模型并将输入数据传递给它,最后打印了输出的形状。

要注意的是,这个示例的数据和任务仅用于演示Transformer模型的使用方式。在实际情况下,需要准备适当的数据和任务设置来训练和使用Transformer模型。

生成对抗网络

生成对抗网络核心思想是模拟人类创造事物的方式。

GANs由两个主要部分组成:生成器(Generator)和判别器(Discriminator)。这两个部分之间进行博弈,使生成器逐渐学会创建逼真的数据,而判别器则逐渐变得更擅长区分真假数据。

基本原理

1、生成器(Generator):生成器的任务是接收一个随机噪声向量,然后将其转化为逼真的数据,例如图像。生成器是一个神经网络,通过不断调整其参数,使其生成的数据与真实数据尽可能相似。

2、判别器(Discriminator):判别器的任务是区分生成器生成的数据和真实数据。判别器也是一个神经网络,它会对输入的数据进行评估,输出一个0到1之间的概率值,表示数据的真实程度。

3、对抗训练:生成器和判别器交替进行训练。生成器努力生成更逼真的数据,而判别器努力变得更善于区分真伪。这种博弈过程推动了生成器不断提高生成的数据质量。

1、生成器的损失函数:生成器的目标是最小化,其中是判别器对生成器生成数据的评价。

2、判别器的损失函数:判别器的目标是最小化,其中是判别器对真实数据的评价,是对生成器生成数据的评价。

一个案例

我们以图像生成为例,使用Python和TensorFlow库来演示一个简单的GANs模型。

import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Reshape
from tensorflow.keras.models import Sequential

# 创建生成器和判别器网络
def build_generator():
    model = Sequential()
    model.add(Dense(128, input_dim=100, activation='relu'))
    model.add(Dense(784, activation='sigmoid'))
    model.add(Reshape((28, 28, 1)))
    return model

def build_discriminator():
    model = Sequential()
    model.add(Flatten(input_shape=(28, 28, 1)))
    model.add(Dense(128, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    return model

# 定义损失函数和优化器,并编译生成器和判别器
generator = build_generator()
discriminator = build_discriminator()

discriminator.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
discriminator.trainable = False

gan_input = tf.keras.Input(shape=(100,))
x = generator(gan_input)
gan_output = discriminator(x)

gan = tf.keras.Model(gan_input, gan_output)
gan.compile(loss='binary_crossentropy', optimizer='adam')


# 训练GANs模型
for epoch in range(epochs):
    for _ in range(batch_size):
        noise = np.random.normal(0, 1, [batch_size, 100])
        generated_images = generator.predict(noise)
        image_batch = x_train[np.random.randint(0, x_train.shape[0], size=batch_size)]

        discriminator.trainable = True
        d_loss_real = discriminator.train_on_batch(image_batch, np.ones((batch_size, 1)))
        d_loss_fake = discriminator.train_on_batch(generated_images, np.zeros((batch_size, 1)))
        d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)

        noise = np.random.normal(0, 1, [batch_size, 100])
        discriminator.trainable = False
        g_loss = gan.train_on_batch(noise, np.ones((batch_size, 1)))

# 生成并可视化手写数字图像
num_samples = 16
noise = np.random.normal(0, 1, [num_samples, 100])
generated_images = generator.predict(noise)

for i in range(num_samples):
    plt.subplot(4, 4, i + 1)
    plt.imshow(generated_images[i, :, :, 0] * 0.5 + 0.5, cmap='gray')
    plt.axis('off')

plt.show()

代码展示了一个简单的GANs模型,用于生成手写数字图像。

训练之后,生成器将生成逼真的手写数字图像,判别器将变得更难以区分真假图像。

生成对抗络是用于各种创意领域。它基于生成器和判别器的博弈,通过不断优化生成器来创造逼真的数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值