Neural Networks-part 3


神经网络-Chap.3

本系列神经网络课程根据Youtube上Andrej Karpathy的系列视频: Neural Networks: Zero to Hero整理而来.
应当可以作为对于LLM进行内部原理理解的入门视频之一.

3.1 引子

上一节, 我们完成了一件伟大的事情!
我们通过一个数据集, 通过两种方式(计数Counting以及神经网络Neural Network)达成了一个目标, 我们根据上一个字母能够预测出下一个字母了.

但我们从结果上来看也确实能明白, 只看前面一个字母不太够. 生成的那几串玩意着实不能算作是名字(笑
这节, 我们要尝试更进一步, 我们要考虑前面更多的字母.

我们试着再用Counting的思路来看看这个问题, 我们会发现这个事情一下子变得超级复杂. 我们如果只考虑前一个字母, 我们上一节中的那个表格是27行.
如果变成了两个字母, 一下子这个表格变成了 27 * 27 行. 我们会发现这个玩意一下子变成了一个指数爆炸的计数方案.

所以本节中, 我们得引入一种新的神经网络模型, 叫做 MLP(Multi-Layer Perceptron) .

额外提一嘴, 读者在看代码的时候还是要参考作者的GitHub Repo: https://github.com/karpathy/makemore

3.2 Rebuilding Dataset

我们现在需要考虑前面的多个字母. 那么第一步, 很遗憾, 我们之前的组织的数据集格式没法用了. 我们得重新组织数据集.

先引入原始数据.

import torch
import torch.nn.functional as F

words = open('names.txt', 'r').read().splitlines()
output
# words[:8] ['emma', 'olivia', 'ava', 'isabella', 'sophia', 'charlotte', 'mia', 'amelia'] # len(words) 32033

建立字母和数字的映射表.

# build the vucabulary of characters and mapping them to integers
chars = sorted(list(set(''.join(words))))
stoi = {s:i+1 for i, s in enumerate(chars)}
stoi['.'] = 0
itos = {i:s for s, i in stoi.items()}
output
{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j', 11: 'k', 12: 'l', 13: 'm', 14: 'n', 15: 'o', 16: 'p', 17: 'q', 18: 'r', 19: 's', 20: 't', 21: 'u', 22: 'v', 23: 'w', 24: 'x', 25: 'y', 26: 'z', 0: '.'}

建立数据集.

# build the dataset

block_size = 3 # context length: how many characters we want to consider in the process of our generation?
X, Y = [], []
for w in words[:5]: # take the first 5 words as examples

    print(w)
    context = [0] * block_size
    for ch in w + '.':
        ix = stoi[ch]
        X.append(ch)
        Y.append(ix)
        print(''.join(itos[i] for i in context), '--->' itos[ix])
        context = context[1:] + [ix] # corp and append

X = torch.tensor(X)
Y = torch.tensor(Y)
output
# output emma ... ---> e ..e ---> m .em ---> m emm ---> a mma ---> . olivia ... ---> o ..o ---> l .ol ---> i oli ---> v liv ---> i ivi ---> a via ---> . ava ... ---> a ..a ---> v .av ---> a ava ---> . isabella ... ---> i ..i ---> s .is ---> a isa ---> b sab ---> e abe ---> l bel ---> l ell ---> a lla ---> . sophia ... ---> s ..s ---> o .so ---> p sop ---> h oph ---> i phi ---> a hia ---> . # X tensor([[ 0, 0, 0], [ 0, 0, 5], [ 0, 5, 13], [ 5, 13, 13], [13, 13, 1], [ 0, 0, 0], [ 0, 0, 15], ... [15, 16, 8], [16, 8, 9], [ 8, 9, 1]]) # Y tensor([ 5, 13, 13, 1, 0, 15, 12, 9, 22, 9, 1, 0, 1, 22, 1, 0, 9, 19, 1, 2, 5, 12, 12, 1, 0, 19, 15, 16, 8, 9, 1, 0])

读者可以仔细理解一下这段代码, 本质上它在做的是一个滑动窗口(Rolling Window)的工作.
实在不成问问AI(笑


文章作者: MUG-chen
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 MUG-chen !
  目录