赞
踩
机器翻译,也称为自动翻译,指的是利用计算机程序将一种自然语言(源语言)翻译成另一种自然语言(目标语言)的过程。它是人工智能领域的一个重要分支,涉及到计算机科学、语言学和数学等多个学科。
机器翻译的历史可以追溯到20世纪40年代,但直到20世纪50年代,随着计算机技术的发展,机器翻译才开始得到实际应用。早期的机器翻译系统主要基于规则,依赖于语言学家提供的语法规则和词典。然而,这种方法存在很多局限性,因为它很难处理语言的复杂性和多样性。
直到21世纪初,随着大数据和深度学习技术的发展,机器翻译迎来了新的突破。现代的机器翻译系统,特别是基于神经网络的翻译模型,能够通过学习大量的双语文本数据,自动发现语言之间的对应关系和翻译规则。
数据准备:收集大量的双语文本对,进行预处理,如分词、去除停用词等。
模型训练:使用神经网络模型(如循环神经网络、长短时记忆网络、Transformer等)对双语文本进行训练,学习语言之间的映射关系。
解码:在翻译过程中,模型根据源语言文本生成目标语言文本。
后处理:对生成的翻译结果进行优化,如语法修正、流畅度提升等。
为使用PyTorch进行机器翻译或其他NLP任务的深度学习模型设置环境,包括导入必要的库、定义特殊标记、设置GPU使用、检查PyTorch版本和设备信息,以及可能导入自定义的辅助模块。
- import collections
- import os
- import io
- import math
- import torch
- from torch import nn
- import torch.nn.functional as F
- import torchtext.vocab as Vocab
- import torch.utils.data as Data
-
- import sys
- # sys.path.append("..")
- import d2lzh_pytorch as d2l
- # 定义三个特殊的标记:PAD用于填充序列,BOS用于序列的开始,EOS用于序列的结束。
- PAD, BOS, EOS = '<pad>', '<bos>', '<eos>'
- os.environ["CUDA_VISIBLE_DEVICES"] = "0"
- # 设置环境变量CUDA_VISIBLE_DEVICES为"0",这通常用于指定CUDA应该使用的GPU设备。
- os.environ["CUDA_VISIBLE_DEVICES"] = "0"
- device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
-
- print(torch.__version__, device)

接着定义两个辅助函数对后面读取的数据进行预处理。
- # 将一个序列中所有的词记录在all_tokens中以便之后构造词典,然后在该序列后面添加PAD直到序列
- # 长度变为max_seq_len,然后将序列保存在all_seqs中
- def process_one_seq(seq_tokens, all_tokens, all_seqs, max_seq_len):
- all_tokens.extend(seq_tokens)
- seq_tokens += [EOS] + [PAD] * (max_seq_len - len(seq_tokens) - 1)
- all_seqs.append(seq_tokens)
-
- # 使用所有的词来构造词典。并将所有序列中的词变换为词索引后构造Tensor
- def build_data(all_tokens, all_seqs):
- vocab = Vocab.Vocab(collections.Counter(all_tokens),
- specials=[PAD, BOS, EOS])
- indices = [[vocab.stoi[w] for w in seq] for seq in all_seqs]
- return vocab, torch.tensor(indices)
使用一个很小的法语—英语数据集。在这个数据集里,每一行是一对法语句子和它对应的英语句子,中间使用'\t'隔开。在读取数据时,我们在句末附上“<eos>”符号,并可能通过添加“<pad>”符号使每个序列的长度均为max_seq_len。我们为法语词和英语词分别创建词典。法语词的索引和英语词的索引相互独立。将序列的最大长度设成7,然后查看读取到的第一个样本。该样本分别包含法语词索引序列和英语词索引序列。
- def read_data(max_seq_len):
- # in和out分别是input和output的缩写
- in_tokens, out_tokens, in_seqs, out_seqs = [], [], [], []
- with io.open('fr-en-small.txt') as f:
- lines = f.readlines()
- for line in lines:
- in_seq, out_seq = line.rstrip().split('\t')
- in_seq_tokens, out_seq_tokens = in_seq.split(' '), out_seq.split(' ')
- if max(len(in_seq_tokens), len(out_seq_tokens)) > max_seq_len - 1:
- continue # 如果加上EOS后长于max_seq_len,则忽略掉此样本
- process_one_seq(in_seq_tokens, in_tokens, in_seqs, max_seq_len)
- process_one_seq(out_seq_tokens, out_tokens, out_seqs, max_seq_len)
- in_vocab, in_data = build_data(in_tokens, in_seqs)
- out_vocab, out_data = build_data(out_tokens, out_seqs)
- return in_vocab, out_vocab, Data.TensorDataset(in_data, out_data)
- max_seq_len = 7
- in_vocab, out_vocab, dataset = read_data(max_seq_len)
- dataset[0]

含注意力机制的编码器-解码器架构是深度学习中用于序列到序列任务的一种模型,特别是在机器翻译领域非常流行。这种架构由两部分组成:编码器和解码器,以及一个注意力机制,用于提高翻译的准确性和流畅性。
基本概念和工作原理:
编码器(Encoder):
解码器(Decoder):
注意力机制(Attention Mechanism):
工作原理:
优势:
变体:
在编码器中,我们将输入语言的词索引通过词嵌入层得到词的表征,然后输入到一个多层门控循环单元中
- class Encoder(nn.Module):
- def __init__(self, vocab_size, embed_size, num_hiddens, num_layers,
- drop_prob=0, **kwargs):
- super(Encoder, self).__init__(**kwargs)
- self.embedding = nn.Embedding(vocab_size, embed_size)
- self.rnn = nn.GRU(embed_size, num_hiddens, num_layers, dropout=drop_prob)
-
- def forward(self, inputs, state):
- # 输入形状是(批量大小, 时间步数)。将输出互换样本维和时间步维
- embedding = self.embedding(inputs.long()).permute(1, 0, 2) # (seq_len, batch, input_size)
- return self.rnn(embedding, state)
-
- def begin_state(self):
- return None
创建一个批量大小为4、时间步数为7的小批量序列输入。设门控循环单元的隐藏层个数为2,隐藏单元个数为16。编码器对该输入执行前向计算后返回的输出形状为(时间步数, 批量大小, 隐藏单元个数)。门控循环单元在最终时间步的多层隐藏状态的形状为(隐藏层个数, 批量大小, 隐藏单元个数)。对于门控循环单元来说,state
就是一个元素,即隐藏状态;如果使用长短期记忆,state
是一个元组,包含两个元素即隐藏状态和记忆细胞。
- encoder = Encoder(vocab_size=10, embed_size=8, num_hiddens=16, num_layers=2)
- output, state = encoder(torch.zeros((4, 7)), encoder.begin_state())
- output.shape, state.shape # GRU的state是h, 而LSTM的是一个元组(h, c)
定义的函数 本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。