2024 08 05 2024 08 05, 2006 今日內容
2024-08-05, 20:06-今日內容
vim /vs code快捷键: 方法method和函数 function的区别。 class里面的函数和外面的函数,不是一样的调用方式哦 Class 的定义 Print 的输出 f string Python里面的提示类型: Jupyter notebook vs code快捷键 把某行代码随意移动 只用键盘 initialize的是给每一个embedding的table的每一个空格赋值。 但是forward。是利用我们已经创建好的table… Constructor的继承。 也就是__init__ 的继承, super().init()的写法 sparse vector 和dense vector 离散的索引和连续的vector Embedding 创建的是vocab size 的row 和vocab size的column 关于def init(self, … ) 关于调用别人写好的函数,怎么指定参数: Super()的用法,还有class的继承 nn里面都包含什么东西(torch) nn.Module 是啥意思(pytorch) Positional encoding 可能会用到的概率相关的东西 (ML/NN) New Note 输:one hot y=x 右偏数据,数据在左侧集中,向右逐渐减少,符合指数分布的特性 propobility 在ML中必须掌握的点。 Zip的作用 slicing 冒号: Min(), max () sum()等等是接受iterable的对象的,所以当我们用len(i) for I in …这种generator… Str.splitlines()可以把输入的str的空格消掉,也就是将str搞成只有word的一个新的list Negatively log likelihood loss 就是cross entropy loss
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
vim /vs code快捷键: 删除 DD 是要esc 到cell。然后按两下DD 才是删除。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
方法method和函数 function的区别。 class里面的函数和外面的函数,不是一样的调用方式哦 方法是class的函数要想用某个class里面的方法,我们就必须要有某个class的instance。 也就是创建一个真实的。 函数就是函数,放在别的任何地方的,他是独立的!
他们两在调用的时候有非常大的不同! Class里面的method在调用的时候,使用一个小点。 Function在调用的时候,就是用()来调用。 这里有个例子:
class Example: def method(self): print(“This is a method”)
创建类的实例
example_instance = Example()
调用方法
example_instance.method() # 输出: This is a method
def backward(): print(“This is a function”)
调用函数
backward() # 输出: This is a function
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Class 的定义 如果要定义class 不要写错了,他不是函数,不需要一开始就在class 啥啥啥的时候写他的函数。 Class的输入的定义要统一的放在__init__里面,这样才是对的额/。 每定义一个class的函数,都要有self写进去。 就像是这样: class jynxzzzLoss: def init(self, value): self.value = value
def backward(self):
print(f'backward called with value: {self.value}')
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Print 的输出 f string 写法就是f’ 在里面要是要调用variable的话,就加上{}就好了’
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Python里面的提示类型: ⁃ 字典是这样的:
Dict[str, Any] 表示key是str类型的,value是任意类型的
⁃ 可以迭代的是这样的: Iterable[]
多种类型的并集是这样的: Union[int, str] 代表可以是int 也可以是str
Any是表示咋都行。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Jupyter notebook 只运行当前的,别移动到下一个 Control + enter
我自己经常用的 shift + enter
debug : 1. 设置红点 2. control + shift enter 3. 出现debug得console
一行一行的执行: F10
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
vs code快捷键 shift + comman + p (更改设置的panel)
shit + command + m (下面的warning)
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
把某行代码随意移动 只用键盘 只需要记住是Alt
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
initialize的是给每一个embedding的table的每一个空格赋值。 但是forward。是利用我们已经创建好的table… initialize的是给每一个embedding的table的每一个空格赋值。 但是forward。是利用我们已经创建好的table来lookup value。 所以才会出现我问的这个问题。 def forward(self, idx): return self.embedding(idx) 这里的embedding(idx)为什么只需要输入一个参数,我看到nn.Embedding不是需要两个参数的吗? self.embedding是跟nn.embedding是完全一样的函数啊
在这里self.embedding(idx)其实是在调用函数了。 你要搞清楚现在我们的模型已经经过了初始化,所以他已经有了这个embedding 的table。 现在我们只是从这个table里抽取我们需要的word的value,所以现在这个表达式其实是用index来对一个nn.torch.tensor进行抽取row的操作。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Constructor的继承。 也就是__init__ 的继承, super().init()的写法 其实在python3中,只要写成最简单的形式就好了。 不需要写class的名字了。 这里的class名字就是自己最新定义的class的名字。self就是现在的实例对象。
super(BigramLanguageModel, self).init(),但在 Python 3 中,可以简化为 super().init()。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
sparse vector 和dense vector Dense vector: 我们创建的np的vector或者torch的vector,一般都是显式的,是dense的vector。他们一般都非常有利于计算,因为他们都显式存储在内存中的, 包括0
Sparse vector: 不是显示的存储在内存的,一般我们都不会碰。 他就是only 存储非零的element,和他的索引。 所以计算效率非常低。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
离散的索引和连续的vector 离散的索引进行计算是没有意义的, 因为他们之间没有任何连续的关系
所以在embedding的时候才会要吧离散的索引转换成连续的vector 也就是dense vector
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Embedding 创建的是vocab size 的row 和vocab size的column 注意,embedding就是一个layer。 他跟linear layer都是一样的,都是layer。 例如我们调用Linear layer得时候:
self.dense = nn.Linear(input_dim, output_dim)是一样的。 self.embedding = nn.Embedding(vocab_size, embedding_dim) 都是在创建一个layer而已。
目的:从discrete tokens 到continuous vector的转换。 说白了他就像是q learning的一个lookup table。 每个文字都有对应的表格位置的value vector。
Row主要是代表每个word的index的 每个row对应的都是这个word的embedding。只是这里的编码方式是bigram,刚好让他的embedding和vocab size 是一样的了
我们每次对一个文字 或者一句话进行编码的时候。我们首先要获取的就是他的index 或者序列list。然后把这些通过去筛选row的号码, 才拉出来他对应的column的具体的embedding的column。
关于一些细节: 1. 随机的weights, shape 就是(vocab_size, vocab_size)embedding的初始化I是要对他产生的shape进行初始化的, 也就是embedding其实是初始化weights。 initialization: self.embedding.weight 时随机产生的。 这些weights是会在训练过程中更新的(updatable and learnable)
2. value range 也就是这些weights,是你指定的。一般来说时uniform distribution 或者normal distribution。
3. 具体的调用embedding来get每个word或者sentence的方法:
input_indices = torch.tensor([1, 2, 3]) embeddings = self.embedding(input_indices) print(embeddings)
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
关于def init(self, … ) 定义时候的问题
这个函数,在我们从别的class继承的时候,基本上都要写。 只要是在这里初始化的时候定义了的variable。也就是这里省略号的位置的variable。我们都需要在实例化这个class的时候,紧跟着对这些参数进行赋值,因为我们的class非常期待收到这些参数的值。 要注意的一点是, 这是关于class的定义,不是关于函数的定义,init__是一个非常特殊的函数,我们传递给他的varible .他会非常智能的自己传递给我们的class,所以相当于我们在class创建的时候,通过__init 可以拥有一大堆属于这个class的variable。 但是这些variable 的定义就需要在__init__里面专门定义。
import torch.nn as nn
class MyModel(nn.Module): def init(self, vocab_size): super(MyModel, self).init() self.embedding = nn.Embedding(vocab_size, vocab_size)
def forward(self, x):
embedded = self.embedding(x)
return embedded
实例化类并传递参数
vocab_size = 100 model = MyModel(vocab_size)
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
关于调用别人写好的函数,怎么指定参数: 一般文档里面会谢每一个Args的标准,也就是他的类型 比如说是int 或者是str,还有他是强制的variable 还是optional的。 一般来说我们仅仅需要强制性的。 然后我们给强制参数的时候,如果不写什么东西等于什么东西,他会按照文档规定的先后顺序来读取我们给他的variable。 所以要注意看文档。如果要指定某个特别的Args的参数,但是又不想一个一个的按照顺序写,就可以直接告诉他Args的keyword关键字,比如这个:nn.Embedding(1000, 64, padding_idx=0)
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Super()的用法,还有class的继承 只要是想让class运行他们自己定义的__init__().就需要执行这个super().init()
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
nn里面都包含什么东西(torch) 各种layer: ⁃ nn.Linear ⁃ nn.Conv2d ⁃ nn.RNN ⁃ nn.LSTM ⁃ nn.GRU 各种损失函数 ⁃ nn.MSEloss ⁃ nn.CrossEntropyLoss 各种激活函数 ⁃ nn.ReLU ⁃ nn.Sigmoid ⁃ nn.Tanh
各种容器: ⁃ nn.Sequential (我们可能用到的) ⁃ nn.ModuleList
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
nn.Module 是啥意思(pytorch) 他是torch里面,专门负责nn的一个NN的模块的基础class。我们从它开始继承,就可以自动求导数了。因为里面有autograd, 还可以让我们简单的一层一层的写layer。
他还提供了forward 也就是向前传播,特别的简单。只需要继承这个class就好了。学会写继承其实很简单。
#torch #NN #autograd #NN_Module
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Positional encoding 主要是告诉model, 这个word和别的word相隔多远,这样的信息有时候对word来说很重要
在attention is all you need 里面。他把word 的embedding后面又加入了一个position embedding的vector(他们选择了size是512)。相当于把location加入进去了。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
可能会用到的概率相关的东西 (ML/NN) sample space样本空间
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
New Note 图解 Word2vec – Jay Alammar – 一次可视化一个概念的机器学习。 — The Illustrated Word2vec – Jay Alammar – Visualizing machine learning one concept at a time.
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
输:one hot 
generated_text = [] for _ in range(100): # 生成100个字符 logits = model(idx) probs = torch.softmax(logits, dim=1) idx = torch.multinomial(probs, num_samples=1).item() generated_text.append(itos[idx]) print(‘‘.join(generated_text)) 
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
y=x 
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
右偏数据,数据在左侧集中,向右逐渐减少,符合指数分布的特性
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
propobility 在ML中必须掌握的点。 Probability Must-Knows for Machine Learning | Math for ML (Part 1)
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Zip的作用 可以把两个或者多个不同长度的list像是拉链一样, 一一对应起来。 然后我们可以用for去access他的每一个扣子里面的pair, 或者搞成一个list输出也行
list1 = [1, 2, 3, 4] list2 = [‘a’, ‘b’]
zipped = zip(list1, list2) print(list(zipped)) # 输出: [(1, ‘a’), (2, ‘b’)]
如果我们要access这个zip好的tuple 我们就可以用for z1, z2 in zip(w, w[1:]): 注意这里的z1, z2, 是两个数,而不是一个数。 如果只写了一个z1, 这样出来的效果就是一个() tuple: (‘e’, ‘m’) (‘m’, ‘m’) (‘m’, ‘a’) 如果我们还想简化, 就可以说:
for ch1, ch2 in zip(c, c[1:]): print(ch1, ch2)
这样出来的结果就是: e m m m m a
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
slicing 冒号: words[:10] 第11个的位置是不保罗/或者说index索引是10的element是不包括的, 因为是从0开始计数。 words[10]就是提取index是10的元素
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Min(), max () sum()等等是接受iterable的对象的,所以当我们用len(i) for I in …这种generator… Min(), max () sum()等等是接受iterable的对象的,所以当我们用len(i) for I in …这种generator的时候,他产生的一一连串可以iterate得对象,所以我们就可以在外面嵌套min, max, sum .
同时,他们也都接受list作为参数,所以两种写法都是对的。 words = [“apple”, “banana”, “cherry”]
使用列表推导式
min_length = min([len(i) for i in words]) print(“Minimum length using list comprehension:”, min_length)
使用生成器表达式
min_length_gen = min(len(i) for i in words) print(“Minimum length using generator expression:”, min_length_gen)
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Str.splitlines()可以把输入的str的空格消掉,也就是将str搞成只有word的一个新的list 所以他的两个功能: 1. Txt 消除空格 2. Str 变成list 方便进行操作
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Negatively log likelihood loss 就是cross entropy loss 公式都是一模一样的,只是说cross entropy loss是更加fancy的说法。 likelihood就是要乘以概率的意思
#匯總今日內容