有效的括号
要点:括号匹配,栈
java
class Solution {
public boolean isValid(String s) {
//栈,push.pop
if(s == null || s.length() == 0){
return true;
}
Deque<Character> stack = new ArrayDeque<>();
for(char c : s.toCharArray()){
if(c == '(' || c =='{' || c =='['){
stack.push(c);
}else{
if(stack.isEmpty()){
return false;
}
char temp = stack.peek();
if(c == ')' && temp == '(' ){
stack.pop();
}else if(c == '}' && temp =='{'){
stack.pop();
}else if(c == ']' && temp == '['){
stack.pop();
}else{
stack.push(c);
}
}
}
return stack.isEmpty();
}
}
简化路径
要点:栈,主要是把题目意思理清楚
java
class Solution {
public String simplifyPath(String path) {
List<String> stk = new ArrayList<>();
for (String s : path.split("/")) {
if (s.isEmpty() || s.equals(".")) {
continue;
}
if (!s.equals("..")) {
stk.add(s);
} else if (!stk.isEmpty()) {
stk.removeLast(); // stk.remove(stk.size() - 1);
}
}
return "/" + String.join("/", stk);
}
}
随机知识
Transformer 的 Self-Attention(自注意力)机制是整个模型的基石。它的本质是**"全局信息聚合"**:让序列中的每个词,都能直接"看到"并融合所有其他词的信息。
你提到的 Q×K → Softmax → 加权 V 是绝对核心的计算主线。为了让你理解透彻,我将严格遵循矩阵运算的维度变换,分三个阶段拆解(附带完整数学公式):
前置准备:输入与投影
假设输入序列长度为 LL,每个词的嵌入维度为 dmodeldmodel。
-
输入矩阵 XX:形状为 (L,dmodel)(L,dmodel)。
-
通过三个可训练权重矩阵 WQ,WK,WVWQ,WK,WV 进行线性投影,生成:
-
Q(查询) :Q=XWQQ=XWQ,形状 (L,dk)(L,dk)。(代表"我想找什么")
-
K(键) :K=XWKK=XWK,形状 (L,dk)(L,dk)。(代表"我有什么索引")
-
V(值) :V=XWVV=XWV,形状 (L,dv)(L,dv)。(代表"我实际携带的内容")
(通常 dk=dvdk=dv,且为了多头方便,常设为 dmodel/headsdmodel/heads)
-
第一阶段:Q × K(计算相似度得分矩阵)
这一步是为了计算序列中任意两个位置之间的关联强度。
-
运算:QQ 与 KK 的转置做矩阵乘法,即 Scores=Q⋅KTScores=Q⋅KT。
-
维度变化:(L,dk)×(dk,L)=(L,L)(L,dk)×(dk,L)=(L,L)。
-
物理含义 :结果矩阵中,第 ii 行第 jj 列的数值,代表第 ii 个位置的 Query 与第 jj 个位置的 Key 的点积。点积值越大,表示这两个位置在向量空间中的夹角越小,关联度越高。
第二阶段:缩放(Scale)与 Softmax(归一化为概率权重)
原始点积值可能非常大(尤其在维度 dkdk 较大时),这会使得 Softmax 的梯度进入极小的饱和区,导致训练困难。因此需要先"降温和稳定梯度"。
-
缩放运算:Scaled_Scores=Q⋅KTdkScaled_Scores=dkQ⋅KT。(除以 dkdk 使得方差稳定在 1 左右)
-
Softmax 归一化 :对矩阵的每一行(即针对当前查询词)应用 Softmax。
Attention_Weights=softmax(QKTdk)Attention_Weights=softmax(dkQKT)
-
维度不变:仍为 (L,L)(L,L)。
-
物理含义 :此时矩阵的每一行都是概率分布,且和为 1。这意味着对于位置 ii 来说,它对序列中所有位置(包括自己)的"关注度"百分比。
第三阶段:加权 V(聚合信息输出)
拿到注意力权重矩阵后,用它去提取 Value 中的实际语义信息。
-
运算:将权重矩阵与 VV 相乘,即 Output=Attention_Weights⋅VOutput=Attention_Weights⋅V。
-
维度变化:(L,L)×(L,dv)=(L,dv)(L,L)×(L,dv)=(L,dv)。
-
物理含义 :对于位置 ii,新输出的向量 = ∑j(注意力权重i,j×Vj)∑j(注意力权重i,j×Vj)。这相当于将序列中所有位置的 Value 按"相似度比例"混合在一起,形成当前位置融合了全局信息的最终上下文向量。
完整数学公式(最终形态)
将上述三步合并,即经典论文中的标准公式:
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(dkQKT)V
深度细节补充(易错点)
-
为什么用 KTKT 而不是 KK:为了保证输出的注意力矩阵是方阵 (L×L)(L×L),使得每个词都能对应一个关于所有词的概率分布。
-
掩码(Mask)在哪介入 :在 Softmax 之前,解码器(Decoder)会将未来位置的得分设为 −∞−∞,这样 Softmax 后概率趋近于 0,从而保证"不能看到未来信息"。
-
多头机制(Multi-Head):上述过程会并行执行 hh 次(多组不同的 WQ,WK,WVWQ,WK,WV),得到多个 (L,dv)(L,dv) 输出,最后拼接并过线性层。目的是让模型从不同语义子空间捕捉关联。
碎碎念:后续会更新每天学习的八股和算法 题,开始准备秋招的第39天。努力连续更新100天!以后每天就按,秋招项目【java +agent】,科研,必做项目,算法,八股,锻炼身体来总结。
总结:aicoding一整天
1.算法面试150 75/150【早中晚】 30min
2.秋招项目,【java 项目】,【修改,1h】
【agent 项目 】,【x修改,1h】
3.科研要跑一下,无
4.检测项目,准备数据集【4h】
6.背八股,无
7.锻炼身体,【1h】
反思:晚上没学习,玩了一晚上,每天开始背背背!!