Transformer 前置知识 08:位置编码
上一课,文字变成了一个个向量。但还有一个问题:
Transformer 是同时看所有词的,它并不知道谁在前、谁在后。
这一课讲模型怎么知道每个词排在第几个:位置编码。
模型在选下一个词的时候,会先给每个候选词打一个分数。可分数有正有负,加起来也不等于 1,没法直接当成概率用。
怎么把一组分数变成概率?答案就是 softmax。要看懂它,先要认识两个老朋友:指数和对数。
上一课讲了梯度下降:算出梯度,反着走一小步,误差就变小一点。
但真实的模型有几十层,很多参数藏在很深的地方,离最后的误差隔着好几层。深处那些参数的梯度,是怎么算出来的? 这一课就来回答这个问题。
00 篇说,这个系列适合”有 C 基础”的读者。可”C 基础”这个说法太宽了:会写
for循环、懂指针和结构体,翻开 Suricata 的源码,还是会被一些写法卡住。这篇番外把读 Suricata 时会遇到的、超出入门教材的 C 语言知识挑出来,每一项都配上源码里的真实例子和位置(基于 8.0.7),并说明前面哪几篇用到了它。
先给一个总览。读 Suricata,最常卡住人的是这几类:
packed。下面逐个看。
这是系列第 10 篇,也是最后一篇。上一篇结尾,一条规则的所有条件都满足了,”产生一条告警”。可告警不是凭空出现在
eve.json里的:它要先经过一轮收尾,再由日志模块拼成 JSON、写到文件里。00 篇开头那行 http 事件,走的也是这条路。这一篇就把最后这一段走完。
先给答案,输出这一段做了三件事:
drop 这类动作,最后挂到 p->alerts 上。OutputLoggerLog() 把包交给几类”根日志器”:包、事务、文件……每一类管着一批日志模块,各模块按自己的条件,或者按事务的进度,决定写不写。画出来是这样的:
这是系列第 9 篇。上一篇讲了一条规则怎么从文本变成结构。可真实的规则集动辄几万条,如果每个包都把几万条规则挨个试一遍,再快的机器也跟不上线速。这一篇看检测引擎怎么把”几万条”压到”少数几条”:规则是怎么分组的,多模式匹配(MPM)又是怎么做预过滤的。
先给答案,靠的是两层筛选:
两层加起来,就是 00 篇第 ⑦ 站说的”先挑出一个规则组(SGH),再用 MPM 一次性搜出所有规则的关键字”: