2024 08 11, 2125 今日內容
2024-08-11, 21:25-今日內容
dropout layer 就是随机的丢弃某些column 某些row上的某些元素 Masked_fill .sum()可以用来统计torch里面的int ,float ,甚至连mask他都能统计。 Model.train 和model.eval 都只是一个模式开关而已没有任何的实际的训练开始的意思 torch.Tensor.item() 啥意思 (.tolist()差不多的意思,但是item 是返回一个元素的情况,.tolist… @classmethod就是把class里面的function或者method弄成可以直接获取的一个的一个方法 Torch里面的model() evaluation和validation的却别 200 iteration torch.zeros torch.nn.Module.eval()是什么东西,是怎么用的。 model的evaluation模式来了 @ 装饰器只能用来装饰函数,不能装饰单独的语句。非要用的话,就是with @torch.no_grad torch.stack 能够堆叠tensor。也能堆叠list[tensor] List dict set 解析。他们里面的for语句的用法 batch里面的Idx 的取值范围和shape Idx 是多少(len(data) - block_size) GPT from scratch If else 条件表达的正确写法 你经常但犯错误的地方 一个浮点数 是没有.int()方法的 Lambda 就是这么牛逼 Sorted 是python自带的一个函数,用来sort一个list,主要是按照字母的先后顺序 a-z来排序的。 gpt3的训练成功了,并且在cuda上训练的超级快。 我的Linux的cuda是11.8 。我又重新安装了支持他的PyTorch 的版本,才能利用cuda来训练gpt Evaluation interval 是什么, 为什么evaluation还需要进行多次? 难道不是training过后evaluation…
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
dropout layer 就是随机的丢弃某些column 某些row上的某些元素 他就是一个layer 他要做的就是随机丢弃weights, 防止我们overfitting
一般这个dropout会放在我们softmax之后。 如果你问我为什么随机dropout之后,softmax的概率相加会不会为1 我会告诉你,不会收到影响。 因为droput会帮你调整剩余的概率。让他们成为1.。。 such a shame
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Masked_fill
他是torch里面的每个tensor都自带的方法,我们可以对每一个tensor做这种马赛克, 很经典的例子用下三角来做
看这:
wei = wei.masked_fill(self.tril[:T, :T] == 0, float(‘-inf’))
wei = F.softmax(wei, dim=-1)
wei = self.dropout(wei)
看到了吗。tensor是个class, 这个masked_fill是这个class里面的function。所以才会直接可以用小点来access他。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
.sum()可以用来统计torch里面的int ,float ,甚至连mask他都能统计。 也就是masked_filled的时候,我们不是要dropout一些元素吗, 他会帮我们验证到底drop了多少东西
你看这个:  
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Model.train 和model.eval 都只是一个模式开关而已没有任何的实际的训练开始的意思 他只是说把dropout和batch normalization的训练行为打开了而已。别的啥也没干。 实际的训练行为是这样的:
当你看到 for epoch i range(num_epochs): for data, target in train_loader: 啥啥啥。。。
这才是训练真正开始的时候。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
torch.Tensor.item() 啥意思 (.tolist()差不多的意思,但是item 是返回一个元素的情况,.tolist… torch.Tensor.item() 啥意思 (.tolist()差不多的意思,但是item 是返回一个元素的情况,.tolist 更加robust,可以以ing对tensor里面有很多value的情况) 就是说 假如这个tensor只有一个元素,那么我们就把standard python number 返回去。
x = torch.tensor([1.0]) X.item() 返回的是1.0
如果他有好多个数的tensor。那么就要用.tolist()
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
@classmethod就是把class里面的function或者method弄成可以直接获取的一个的一个方法 我们可以不用呼叫self,直接有convention吧self搞成cls 。 然后我们就不用每次都initiate这个class,而是直接class的名字,在接他的function 就可以呼叫这个class的函数了 超级方便。 注意这个@class method是在class的method里面定义的。 不是在class的外面定义的。 他就是对method进行的一个转换!
一个简单的例子:
class MyClass: class_variable = 0
@classmethod
def increment_class_variale(cls):
cls.class_variable += 1
@classmethod
def get_classvariable(cls):
return cls.class_variable
MyClass.get_classvariable() MyClass.increment_class_variale() MyClass.get_classvariable()
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Torch里面的model() 他返回什么,主要是看forward 里面的定义 一般forward 让他返回什么。我们在呼叫model的时候,就会返回什么。 比如你看这里,gpt model的forward。 这里就有logits, loss,我们就可以获取到logits, loss 
至于为什么你说呼叫这个model,他返回的是forward这个function里面的东西。是因为torch 帮助我们呼叫了一个__call__ 这个方法内部会调用forward 方法,所以呼叫model其实就是呼叫的forward
一个简单的例子:
class SimpleCallable: def call(self): print(“This instance can be called like a function!”)
instance = SimpleCallable()
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
evaluation和validation的却别 训练集合分成train test validation 但是model的评估叫做evaluation 一般来说 evaluation 是指model已经完成训练了,做最后的评估
validation set 是说还没有完成评估,还在用hyper parameter做一些调试和验证
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
200 iteration 
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
torch.zeros 返回的是满足你给出的形状的全是0的torch.tensor的matix。 每一个row都是一个tensor
你只需要给出形状的shape就好了 一个简单的例子:
torch.zeros(2,3) 就是shapeshifter (2, 3)的一个全是0 的torch tensor 组成的matrix
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
torch.nn.Module.eval()是什么东西,是怎么用的。 model的evaluation模式来了 如果你让你的model搞成了model.eval() 也就是换句话说,现在咱们进入evaluation 的模式了。
没有dropout 没有batchnorm 也就是在eval 或者推理的阶段使用固定的参数
在这个模式下面,我们可以让model进行推理了 注意这时候就没有训练模式的方向的传播和训练了。 一般来说,大家是这么写的:
可以看到,他把torch.no_grad()用来装饰这个我们的estimateloss的函数了,然后在保证最大效率的跑,没有方向传播来各种计算后,才开始说我们model进入了model.eval()的模式。然后他分别计算了最后的train和validation的loss。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
@ 装饰器只能用来装饰函数,不能装饰单独的语句。非要用的话,就是with 我这么写,是错的。。。
set model to eval mode
model.eval()
under eval mode, we inference
@torch.no_grad() model(torch.randn(1, 10))
如果非要用这个torch.no_grad()的function可以写成这种形式: With 啥啥啥: 也就是说@ 和with可以起到一样的效果
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
@torch.no_grad 首先它是一个装饰器,也就是套在函数上的函数。主要用在计算validation的loss的时候
主要用在不需要梯度计算的代码块,经常是validation的时候用,因为不需要backpropogate了 可以加快计算和减少内存使用
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
torch.stack 能够堆叠tensor。也能堆叠list[tensor] stack默认dim堆叠是0 ,如果你不指定的话,他就在第一个维度给你堆叠 我就学习到了一个例子。来完成这种操作,在gpt from scratch里面:
b = [data[i:i+block_size] for i in ix] type(b) 是个list!!!
但是我们却可以这样:
c = torch.stack(b)
c可以堆叠的,并且出来是一个tensor! 完美的tensor

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
List dict set 解析。他们里面的for语句的用法 注意,我们并不能单独的用for来产生一系列的数字,因为他不能当作一个返回value返回。我们只能把这个用法用在list或者dict或者set里面!
详细的用法是这样的,用他们的符号筐住这个for语句:
a = [data[i:iblock_size] for i in ix]
b = {i: data[i] for i in ix} s = {data[i] for i in ix}
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
batch里面的Idx 的取值范围和shape 主要关注最大值,也就是我们不能让他超过Len(data) - block _size
shape 其实就是一个维度的,因为我们只关系这个batch是多大,所以说batch有多大,就代表我们要从里面抽取多少次, 所以给他一个shape(batch_size, )就能够说明问题了
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Idx 是多少(len(data) - block_size) 
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
GPT from scratch 
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
If else 条件表达的正确写法 你经常但犯错误的地方 不能写成:
data = train_data if set_name == “train” else data = val_data
永远记住,else只是要你写返回的值,因为全面都在判断了。 你看到if 什么什么,else什么什么,你就要知道,他是要你从这一句话产生一个返回值,最后再赋予data!! 所以不需要你再乱写什么data = val_data 在后面了 正确写法 永远记住:
data = train_data if set_name == “train” else val_data
这里有个简单的例子:
也就是这个判断表达式很复杂的写法: 和最简单的写法,永远要学会最简单的写法!
使用三元运算符
x = 10 result = “Even” if x % 2 == 0 else “Odd” print(result) # 输出: Even
使用常规的 if-else 语句
x = 10 if x % 2 == 0: result = “Even” else: result = “Odd” print(result) # 输出: Even
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
一个浮点数 是没有.int()方法的 Class float 根本就没有定义他有int这个function 所以不能这么用 只能说直接调用int函数,你才能实现这样的转换
但是在PyTorch 里,你就可以这样任意的转换。他们竟然定义了int 和float的相互转换,跟python的严谨完全不一样!
gpt是这样解释的:
在 PyTorch 中,这些方法是张量对象的一部分,提供了方便的 API 来处理张量的数据类型转换。而在 Python 中,转换数据类型依赖于内置的全局函数 int() 和 float()。
such a shame
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Lambda 就是这么牛逼 你看看你写的一大串代码,别人用lambda一行就写出来了。。
def encoding(word): j = [] for char in word: i = stoi[char] j.append(i) return j 这是你自己写的
pro_end = lambda word: [stoi[i] for i in word]这是别人写的 你自己看吧 这就是水平的差距和区别
输出结果都是 [44, 59, 41, 49, 1, 63, 53, 59, 2]
但是别人的就是比你的看起来清爽和简单。。 好好训练 争取自己也能熟练掌握这种写法。其实他也用了for。只不过他知道str 是iterable的,所以他就用了很简单的形式,在一个list[]里面,进行了经典的for的循环。 这一切的发生,都来源于lambda 允许他输入一个word。 thats it
Decoding 和encoding 的用法是不一样的,精髓就在于number和str的区别。 所以 我们在encoding的时候,会说:
encoding = lambda word: [stoi[i] for i in word] 但是如果decoding, 我们就会发现我们的每一个字母都是一个一个分开的。 这不是我们想要的结果,我们想要str就是str的连接方式,所以这就用到了一个特殊的连接’’.join() join里面的就是我们想要他进行连接的东西,我们竟然在这个join里面实现了一个for的循环, 拿到了一连串我们想要的东西。
Join 的help 是这样的: ‘.’.join([‘ab’, ‘pq’, ‘rs’]) -> ‘ab.pq.rs’
也就是他会把我们输入给他的str 用前面我们给他的那个🔗符号join起来。我们的list给他多少,他就join多少,所以我们才可以给他一连串这些东西。而不是只可以让他接受两个东西。 注意之前一直都有一个误区,就是我们以为最开始的那么是最开始的str,其实不是的,他是我们的join的连接符号。在gpt from scratch里面,他直接让这个东西是空的‘’精彩
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Sorted 是python自带的一个函数,用来sort一个list,主要是按照字母的先后顺序 a-z来排序的。 他主要是用来对NLP的一些前期的字母表的准备工作
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
gpt3的训练成功了,并且在cuda上训练的超级快。 这是训练结果 
我利用了watch 间隔1s刷新nvidia-smi 来看。 可以看到我但是的gpu利用率。现在显示是0了,但是当时是99%
而且功率也飙到了快450w了。
现在我们训练了5000个iter。Training loss 比val loss 小,说明可能我们overfitting了。或许可以增加训练数据的量,或者早早的停下,early stopping。 你可以看到训练出来的结果还是非常理想的。 是我们想要的,太好了。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
我的Linux的cuda是11.8 。我又重新安装了支持他的PyTorch 的版本,才能利用cuda来训练gpt
CUDA 11.8
conda install pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 pytorch-cuda=11.8 -c pytorch -c nvidia
这是我安装的代码
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Evaluation interval 是什么, 为什么evaluation还需要进行多次? 难道不是training过后evaluation… Evaluation interval 是什么, 为什么evaluation还需要进行多次? 难道不是training过后evaluation一次就行了吗?
他叫做定期评估!
避免underfitting + overfitting earlystopping 就是说! 在多次我们对他进行的evaluation 评估上,他要是性能不再上升,我们就early stop!
他可以帮我们早早的停下,并且更好的监控和优化参数。
#匯總今日內容