2024-08-12, 19:50-今日內容

GitHub 或者Git 怎么看远程的branch和本地的branch,创建新的branch GitHub 或者git里面,remote 就是问远程的repository, GitHub 的git推送命令里面。 -u 是说 告诉upstream 也就是上游的意思 .vimrc 模版 Vim 想要快速comment torch 里面的children 就是我们创建的一个新的模型(很多模型组合在一起的东西,我们呼叫这个我们自己的模型的children… isinstance 在检查是不是某个class的实例的时候很有用。他和children的作用是类似的。只不过children是… init weights 用的是apply的方法 weights的初始是很重要的 最开始我们一般都用uniform 分布的weight 每次我们创建一个nn.Module ,一个简单的nn.Linear 或者别的layer的时候,这个layer有自己的attribute… *在python list里面的作用,就是unpack。也就是吧list里面的元素element 抽取出来。星号运算符! * 在class init 定义的时候,就可以调用class后面定义的函数了。这是合法的! Position embedding 和token embedding transformer block = multihead attention block + feedforward block… attention后面一层要接上feedforward 的layer,来进行线性变换和非线性变化(ReLU)来让模型补货更多的特征… model Yon 很多个Head 在torch 里面 怎么表达: nn.ModuleList 进行多个Head的并行计算,最后可以把结果拼接出来 multihead 是被多个single head 拼接而成的他的size是: Attention class ,继承于 nn.Module,是我们自己定义的model。 所有从nn.Module 继承的东西,他…

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

GitHub 或者Git 怎么看远程的branch和本地的branch,创建新的branch 看remote的: git branch -r

看本地的: git branch

-b 就可以帮你创建新的branch了

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

GitHub 或者git里面,remote 就是问远程的repository, 如果要看它的名称和url可以这么说

git remote -v

git remote -v origin git@github.com:Jynxzzz/Harvard_python-.git (fetch) origin git@github.com:Jynxzzz/Harvard_python-.git (push)

你看到了吗,origin 就是远程的名字 一般大家都叫初代origin ,就是初代僵尸的意思

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

GitHub 的git推送命令里面。 -u 是说 告诉upstream 也就是上游的意思 一般就说-u origin ,这里的origin一般就是上游的repository的代称

如果你要搞一个自己的branch在GitHub,你就说:

git push -u origin 你的branch的名字

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

.vimrc 模版 “ 基本配置 set expandtab “ 用空格代替制表符 set tabstop=4 “ 制表符占用 4 个空格的宽度 set shiftwidth=4 “ 缩进也采用 4 个空格的宽度 set softtabstop=4 “ 软制表符宽度 set autoindent “ 自动缩进 set smartindent “ 智能缩进

” 搜索配置 set ignorecase “ 搜索时忽略大小写 set smartcase “ 如果搜索包含大写字符则不忽略大小写 set incsearch “ 输入搜索内容时就显示搜索结果 set hlsearch “ 搜索时高亮显示匹配的内容

” 插件配置 “ 使用 vim-plug 管理插件 call plug#begin(‘~/.vim/plugged’)

Plug ‘preservim/nerdtree’ “ 文件浏览器 Plug ‘junegunn/fzf’, { ‘do’: { -> fzf#install() } } “ 模糊搜索工具 Plug ‘jiangmiao/auto-pairs’ “ 自动添加括号 Plug ‘sheerun/vim-polyglot’ “ 语法高亮 Plug ‘neoclide/coc.nvim’, {‘branch’: ‘release’} “ 代码补全 Plug ‘vim-airline/vim-airline’ “ 状态栏增强 Plug ‘vim-airline/vim-airline-themes’ “ 状态栏主题 Plug ‘preservim/nerdcommenter’ “ 注释工具

call plug#end()

” 快捷键设置 nnoremap n :NERDTreeToggle " 设置快捷键打开和关闭NERDTree

” 额外配置 set mouse=a “ 启用鼠标支持 set clipboard=unnamedplus “ 允许 Vim 访问系统剪贴板 set backspace=indent,eol,start inoremap x

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

Vim 想要快速comment 就是\ c space 这三个组合 就可以切换comment和不是comment了

这个插件在NERDCommenter

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

torch 里面的children 就是我们创建的一个新的模型(很多模型组合在一起的东西,我们呼叫这个我们自己的模型的children… torch 里面的children 就是我们创建的一个新的模型(很多模型组合在一起的东西,我们呼叫这个我们自己的模型的children)他会返回给我们所有我们用来构建我们自己模型的子模型。 她和isinstance 的作用是类似的。 但是他是直接返回属于摸个模块的子模块,is instance是检查某class是不是属于另一个class

有个简单的例子

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

isinstance 在检查是不是某个class的实例的时候很有用。他和children的作用是类似的。只不过children是… isinstance 在检查是不是某个class的实例的时候很有用。他和children的作用是类似的。只不过children是 遍历当前模块的子模块,不检查类型,直接返回子模块。 is instance是用来检查class是不是属于某一个class的。

这里有个简单的例子:

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

init weights 用的是apply的方法 weights的初始是很重要的 最开始我们一般都用uniform 分布的weight 但是你懂的。更好的weight的初始化会加速收敛,或者可以帮助解决梯度消失或者爆炸的问题。

Apply method 其实是每一个nn.Module class的自带的函数。所以我们可以用小点 来直接调用apply。至于这个apply的variable,当然是我们要他apply的weights。

所以我们自己写weights的initialize函数来实现这个功能。 但是有一点特别要注意,apply直接把我们init_weights的函数名字放进去了,也就是函数调用函数。 init_weights 这个函数根本就没有参数。 (或者他的参数就是module 也就是一些nn.Linear 等的模型) 他会检查我们的模型的类型,如果是某一种类型,他就给某一种类型的函数init 他的weight。

为什么apply函数输入的是init_weight函数的名字,但是没有放进去任何参数? 这样函数调用函数,但是不写init_weight需要的参数m 是可以的吗? 为什么

他解释说,是因为apply会自己将每个子模块,或者说model递归,并把它们作为参数传递到init_weight函数。这就是为什么我们不需要显式的传递modle.torch帮我们完成了这件事。

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

每次我们创建一个nn.Module ,一个简单的nn.Linear 或者别的layer的时候,这个layer有自己的attribute… 每次我们创建一个nn.Module ,一个简单的nn.Linear 或者别的layer的时候,这个layer有自己的attribute weight。也就是这个weight是自带的,我们创建了nn.Linear , 我们就可以访问他的weight

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

在python list里面的作用,就是unpack。也就是吧list里面的元素element 抽取出来。星号运算符! * 用法是这样的a 这里我们知道a是一个list 这样就可以得到一系列a的元素了,他们现在是tuple了,也就是很多个元素了,或者说返回值了,并不只有一个list了。 你明白了吧,他在我们拼凑sequential模型的时候特别有用。这里有一个具体的用法:

self.blocks = nn.Sequential(*[Block(n_embd, n_head=n_head) for _ in range(n_layer) ]) 他这里帮助我们叠加了超级多层的layer的transformer。 amazing

每一个transformer都叫一个Block,每个Block包含了我们的multi head attention和feedforward layer

一个简单的例子:

def my_function(a, b, c): Print(a, b, c)

My_list = [1, 2, 3] My_function(*my_list) 输出是1,2, 3

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

在class init 定义的时候,就可以调用class后面定义的函数了。这是合法的! 是因为当你写完了整个class。这个class就被放进去pc解析了,然后他就拥有了所有class的代码,不管你是写在前面还是写在后面,他都有所有你的class的信息,所以不存在说class的__init__不能拿到class后面裁定定义的函数。 你懂了吗, 解析是等你把所有东西写完了才解析的!!! 这涉及到了coding非常基础 但是非常重要的概念!

你可以看一个非常重要的例子:

class MyClass: def init(self, value): self.value = value self.call_method()

def call_method(self):
    self.another_method()
    
def another_method(self):
    print("Method called!")

obj = MyClass(30) # 输出:Method called!

你可以看到这里的__init__一层一层的往下call函数

懂了嘛,注意后写的function竟然能够值最开始就被呼叫。这就是精髓。

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

Position embedding 和token embedding 是咋回事,就是说找到这个word在block的位置。 至于token embedding,是找到这个word在整个词汇表的vector。 我们的词汇表是固定的[a, b….z] 所以这也是一个维度

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

transformer block = multihead attention block + feedforward block… transformer block = multihead attention block + feedforward block = Block

他就是用一个新的Block来表示新组装的这个block 其实就是组装了multihead attention 和feedforward layer而已。没什么稀奇的。

值得注意的是,他self attention出来了之后,把这个layer 弄辱骂里扎提哦那了。然后又输入了feedforward,然后又normalization了。 用到的就是 layer normalization,中文叫做层归一 ,(LayerNorm)

是为了稳定gradient, 防止gradient vanishing / exploding

至于具体是怎么把这些模块的东西都加在一起的, 就是输入x之后, 直接让x加上这些attention 的处理结果, 然后让新的x再加上feedforward的处理结果而已。。。

其实这里可以有很多改进空间。

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

attention后面一层要接上feedforward 的layer,来进行线性变换和非线性变化(ReLU)来让模型补货更多的特征… attention后面一层要接上feedforward 的layer,来进行线性变换和非线性变化(ReLU)来让模型补货更多的特征。 在attention is all you need里面 他就是这么用的。 把很多的layer 写到了这个里面。他使用一个Sequential来把这些layer连接起来。

在线形layer, 他用Linear layer来做的,他还把中间的输出做到了4倍的n_embd 的neuron来增加模型捕捉更多特征的可能性。

你可以看这个例子:

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

model Yon 

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

很多个Head 在torch 里面 怎么表达: nn.ModuleList 进行多个Head的并行计算,最后可以把结果拼接出来 有一个专门的ModuleList来做这个事 我们直接用self.heads = nn.ModuleList([Head(head_size) for _ in range(num_heads)])

你可以看到这个Head 其实是我们自己定义的一个class,他专门是用来构建Head这个机制的,他是nn.Module的一个subclass。 

你可以看到multihead 其实就用到了这个Head的class ,但他不是直接继承的class Head,而是继承的nn.Module. 为什么呢?

因为这里是组合大于继承! 他不是一个single head了! 每个head都是独立的,他们独立工作,我们需要他们合作的时候,组合起来就够了。

我们在做的是模型套模型,multihead model 套住了head (single head model)利用的就是大模型 =nn.ModuleList([小模型 for i in n])

他的返回值不是一个模型,而是一个子模块,他就是一个容器!!! container!! 就像是空洞骑士 ,一个虚空的心,来管理这些子模块的。

他的作用就是帮助这些小小的子模块的参数自动注册和管理,。 这样你管理起来就更方便了。 他真是一个伟大的东西

你可以看看他有多伟大: 还有他的返回值类型:

 你可以看到 ,我们的Head 模型。他就是一个model

但是ModuleList 的返回值就是一个个model组成的list,名字叫ModuleList

注意有个地方特别容易错,  你可以看到这里的nn.Linear(5, 4)是一个函数,他在nn.ModuleList里面并没有接受任何参数的值,因为我们并不能直接让他接。 我们这个list的目的是把很多这样的模型抽象画,在最后我们才会统一让他们表现。你懂了吗。我自己做了一个简单的例子 ,你看看:

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

multihead 是被多个single head 拼接而成的他的size是: 有多少个头 就拼接多少次

(B, T, head_size * num_heads)

Single head 的shape 是这样的: (B, T, headsize)

我们需要经过multi head之后 也能匹配得上n_emb 所以才会有线性变换,变化multihead 的维度到 (B, T, n_embd)

具体你问我怎么做的?? 这样!!

Self.proj(B, T, head_size * num_heads) —-> (B, T, n_embd)

骗你的,其实code是这样的:

self.proj = nn.Linear(head_size * num_heads, n_embd) # 将拼接后的多头输出变化到n_embd 维度

注意找forward里面,也是需要拼接的

out = torch.cat([h(x) for h in self.heads], dim=-1)

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

Attention class ,继承于 nn.Module,是我们自己定义的model。 所有从nn.Module 继承的东西,他… Attention class ,继承于 nn.Module,是我们自己定义的model。 所有从nn.Module 继承的东西,他都必须有forward 的方法,强制我们实现先前传播。只要你看到forward方法实现了,一般都可以认定这个class就是一个我们自己定义的model了。他一般会在init的部分定义每个layer的结构,比如说Linear layer,并且给出每个layer的neuron的大小。

nn.Module是一切layer和submodule的标准,是你用的最多的东西

#匯總今日內容