2024 08 13, 1925 今日內容
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
#匯總今日內容