2024-08-13, 19:25-今日內容

Self 调用forward 方法的讲解 Cross entropy loss (batch) logits 和target(y)我们虽然把每个样本的每个字的概率都算出来了… 1 Logits和target(y) 对应分类任务(gpt) crossentropy crossentropy是在计算所有的样本的损失。 他接受的形状是(N, C) token embedding 是想要什么 idx=(3,10) token embedding和 position embedding broadcasting只有最后一个维度,其中一个是1或者完全与另一个matrix的最后一个维度完全一样的时候,才可以broadcasting。 对于matrix 乘法* 和dot product 或者矩阵乘法是不一样的 3维矩阵的T 比如c.shape = ([2, 3, 4]) 他的T也就是transpose是 (4, 3, 2) Torch 里面的重塑view 里面的-1 是啥意思 real number R 是什么 broadcasting 是怎么回事 numpy torch numpy axis 0 和1 是什么意思。 就是axis =0 就是沿着0,也就是每一个row做很多的操作,比如把所有的row加起来,做平均,等等 Linux 想要在terminal一次推送很多条命令,就用&& 连接,外面没有“” 就像这样: position embedding 就是对T时间上的先后顺序进行coding

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Self 调用forward 方法的讲解

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Cross entropy loss (batch) logits 和target(y)我们虽然把每个样本的每个字的概率都算出来了… Cross entropy loss (batch) logits 和target(y)我们虽然把每个样本的每个字的概率都算出来了,在计算loss的时候,我们只需要真实标签的那个字对应的NLL (negative log likelihood) 别的概率都不用管了。

 这是整个过程的逻辑 。

import torch import torch.nn.functional as F

假设 logits 和 target 已经定义

logits = torch.randn((2, 3, 4)) # 4 类别 target = torch.randint(0, 4, (2, 3)) # 使用 randint 生成目标类别索引

计算 softmax

softmax = torch.softmax(logits, dim=-1) log_prob = torch.log(softmax)

展平 logits 和 target

B, T, C = logits.shape logits_flat = logits.view(B * T, C) target_flat = target.view(B * T)

提取目标类的 log-probabilities

nll_loss = -log_prob.view(B * T, C)[range(B * T), target_flat]

计算总体损失(例如,平均损失)

loss = nll_loss.mean() print(‘Overall loss:’, loss)

#crossentropy #logit #NLL #llikelihood #torch

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

1 

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Logits和target(y) 对应分类任务(gpt) crossentropy logits在最后一程的输出了,他的形状,分类任务来说,一般都是B, T, C。其中C就是Class, NLP就是分类任务,所以C就是26. 不管中间层怎么变化,最后输出的layer一定会吧维度重新搞到最后一个维度是C。 这样才能够用crossentropy进行比较。

#crossentropy #logits #target #y

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

crossentropy是在计算所有的样本的损失。 他接受的形状是(N, C) 其中N就时所有的样本总数,包括了Batch和每个batch里面每个独立的数据量。 在GPT里面,就是每个独立的时间步数T。

这是一个简单的例子:  你可以看到B*T就是样本总数了。

因为我们要的loss 其实就是一个平均值,所以这样子压缩,也是可以的,根本不会影响最后的平均值的计算。

gpt对此的解释很精彩:

在 torch.nn.functional.cross_entropy 中,输入形状 (N, C) 是可以接受的,因为这是交叉熵损失函数的标准输入形式。这里的 N 是样本总数(通常是批次大小 B 乘以序列长度 T),C 是类别数。将所有批次和每个批次的数据展平有以下几个实际意义:

批次处理:将批次数据展平可以有效利用矩阵运算的优势,提高计算效率。

避免混淆:交叉熵损失函数可以处理展平后的数据,因为每个样本的目标类别仍然是明确的。

损失计算:最后的交叉熵损失是所有样本损失的平均值,因此不会因为展平操作而影响损失的计算。

具体来说,展平后的数据形状 (N, C) 和目标形状 (N) 可以确保每个样本的预测和目标一一对应,从而正确计算损失。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

token embedding 是想要什么 他要的就是idx , idx的shape是(B, T)

  

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

idx=(3,10) 

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

token embedding和 position embedding 一般来说 矩阵相加 相减 相乘 相除 都是要用到broadcasting的。 比如在gpt里面,tok_emb + pos_emb 就是把 (B,T, C)的tok_emb 和 (T, C)的pos_emb搞到一起

也就是吧(T, C)广播到了B的维度

导致pos_emb也能对应到每个Batch

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

broadcasting只有最后一个维度,其中一个是1或者完全与另一个matrix的最后一个维度完全一样的时候,才可以broadcasting。  

 一般来说 矩阵相加 相减 相乘 相除 都是要用到broadcasting的。 比如在gpt里面,tok_emb + pos_emb 就是把 (B,T, C)的tok_emb 和 (T, C)的pos_emb搞到一起

也就是吧(T, C)广播到了B的维度

导致pos_emb也能对应到每个Batch

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

对于matrix 乘法* 和dot product 或者矩阵乘法是不一样的 一般的乘法时element wise的,就是每个位置上的跟对应位置上的相乘

但是dot product就是一个维度的vector乘法,又要乘又要加(他不能在二维以上用,torch说的,torch只接受@或者torch.matmul())

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

3维矩阵的T 比如c.shape = ([2, 3, 4]) 他的T也就是transpose是 (4, 3, 2) 如果只想要叫喊最后两个维度,也就是保持B batch不变! 那么就要用transpose 或者permutation来交换它们的位置

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Torch 里面的重塑view 里面的-1 是啥意思 就是他的shape是由别的matrix推断出来的

比如说

import torch

C = torch.zeros((2, 3, 4)) reshaped_C = C.view(2, -1) # 例如,将 C 变形为 (2, 12) print(reshaped_C.shape)

注意-1并不代表dim是-1的意思。因为你并没有指明dim,所以torch根本不知道你什么意思

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

real number R 是什么 real number 可以是正数, 负数, 0 表示在数轴上你能找到的所有的数 2, -3, 5 , 2/9等等

无理数: 不能表示为两个整数相除的数字,或者2 ** 0.5, 或者pi

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

broadcasting 是怎么回事 numpy torch 

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

numpy axis 0 和1 是什么意思。 就是axis =0 就是沿着0,也就是每一个row做很多的操作,比如把所有的row加起来,做平均,等等 

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Linux 想要在terminal一次推送很多条命令,就用&& 连接,外面没有“” 就像这样: git add . && git commit -m “word_embding” && git push

或者 这样写:

bash -c “git add .; git commit -m ‘word_embding’; git push”

但是一定要加上-c 他就是告诉他,这一串是个command 一样的 同样的python 你也可以这么说

-c 是一个命令行选项,用于告诉解释器(如 bash 或 python)执行后面跟随的字符串作为命令。例如:

bash -c “commands”:bash 会执行引号中的命令。

python -c “code”:python 会执行引号中的 Python 代码。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

position embedding 就是对T时间上的先后顺序进行coding 先用nn.Embedidng创建一个table ,这个table就是word最长的长度,再乘一个emb 的长度 我们的任务就是给他索引idx而已。 这个idx ,这idx就是一个list,这个list的每一个元素都是word的位置(也就是时间上的顺序的T的位置!!!! 就是谁是第一个word 随时第二个word这样的顺序),也就是从0 到 T-1,我们拿着这个数字,把他输入到我们的embedding table(就是把索引当作variable输入进去这个table)我们就可以拿到对应的embedding了

这个embedding table 一般都是随机的。我们如果想看他的weight 可以用这个:

embedding.weight 因为只要是遗传自Nn.Module的东西,都是有weight的。

他的类型是Nn.module.sparse.Embedding

如果我们想给他重新初始化 我们可以说: import torch.nn.init as init

Init.uniform(embedidng.weight, a=-1, b=1

我们用uniform distribution来初始化这个weight,范围是-1 到1

#匯總今日內容