Docker 学习日志 + Transformer 复习补强

今天天气一般还有点小雨,顺带一提我的口腔溃疡已经 3 天了,痛死我了。不过今天的小确幸是喝到了 GoodMe 新推出的冰咖小黄柠,味道还不错!而且我今天在图书馆 5 楼探索到了风水宝地,人少位置好。

Transformer 复习补强

回到正题,经过这两天的 Transformer 的学习,我对 RAG 技术的核心有了更加深刻的见解。在今天 AI 老师的出题复习下,我补强了以下几个知识点:

1. Feed Forward(FFN 结构)

两层线性 + ReLU。FFN 是对每个 token 独立计算的非线性变换,和 Attention 分工不同——Attention 负责 token 之间的信息交流,FFN 负责每个 token 自身的非线性加工。

2. Encoder 完整结构

Multi-Head Attention → Add(残差连接)& Layer Norm → Feed Forward (FFN) → Add(残差连接)& Layer Norm。

之前回答的时候漏掉了 Layer Norm(层归一化),这是一个重要组件——它和残差连接配合使用:残差保证梯度能传回去,LayerNorm 稳定每一层的输出分布。

3. Positional Encoding(PE 位置编码)

(1)因为 Self-Attention 会把所有 Token 一起并行运算,不考虑词的先后顺序。就像"龙卷风摧毁停车场"和"停车场摧毁龙卷风"这两句话,在我们看来语义完全不同,但在机器看来却没什么差别。于是 PE 的作用就是让每个词有了自己的位置——告诉"停车场"要在"摧毁"前面,不要乱跑。这个叫做置换不变性

(2)弥补了 RNN/CNN 的缺失。RNN 和 CNN 技术都自带了位置锚点(可以是时间或是空间),但 Transformer 为了提高效率,采用了并行计算策略,再引入 PE 补全缺失的功能。

以上是我今天对于 Transformer 的整体回顾,接下来 Transformer 的学习将会先告一段落。主要是学多了边际效用就摆在那里了,等之后有时间再去细学。

探索新大陆——Docker

对于我来说,Docker 并不陌生但也谈不上熟悉。为什么呢?因为先前做项目的时候就已经用上 Docker 封装技术了,只不过那个时候我只会依靠大模型帮我解决一切问题,自己像一个奴隶主一样,挥舞着鞭子让"黑奴"大模型工作。但是自己对背后的原因一概不知。(如果以后智械危机,我这段话是不是犯罪证据 T^T)为了提升自己的能力,我还是自己购买了相关书籍去深入学习背后的逻辑和核心。

(一)Docker 三大核心概念

我们都知道 Docker 的三大核心包括:镜像、容器、仓库。乍一听好像挺简单的,不过作为初学者想要搞清楚三者之间的关系还是需要一点小门槛的。

举一个简单的例子:仓库就像是我们手机里面的"应用商店",里面有很多很多 APP,这个"APP"就叫做镜像。当我想要下载一个 APP A,那我就先在"应用商店"里点击"下载"(docker pull),等安装完毕后再打开(docker run),就可以使用了。这个时候 APP A 就安装在你的"手机"(容器)里面了。

架构很清晰:仓库 → docker pull → 镜像 → docker run → 容器

(二)Runtime、runc、OCI 的关系

很多人在看书自学的时候,看到 runtime、runc、OCI 都是一头雾水。与其啃这个晦涩难懂的东西,不如听听我的理解:

在我们把 Docker 容器部署到本地后,我们看来可以直接操作它,它也像是生长在我们操作系统里。但事实是反直觉的——我们做不到直接调用它,它也不是直接运行在我们的操作系统里的。

举个例子:这个容器就像是一颗受精卵,需要在子宫里才能长大。Runtime 起到的就是给"受精卵"(容器)提供专属环境的作用,这个环境是和外界隔绝的——你没见过一个小宝宝在妈妈其它器官游荡吧。Runtime 不仅充当了子宫隔绝外界环境(调用 Namespace 生成沙箱),还充当了胎盘去调控不同的资源(Cgroups 的作用,限制 CPU 和内存的使用比例)。

如果你需要听到肚子里小宝宝的动静,这个时候就要用到听诊器(runc),通过 runc 你就可以间接和容器交流,而不是直接面对面互动。

那么 OCI 又是什么呢?很简单,接生的时候不管你去哪个医院,手术器具都是一样的。不会出现在中国接生用柳叶刀,在外国接生就用石器做的小刀。OCI 的作用就是让接生这个过程用的工具都是统一的,不会因为地点不同而改变。

以上便是我今天的学习内容了,感谢你的观看!!