跳到主要内容

Transformer 网络及任务分类

· 阅读需 3 分钟
Danny He
Developer in ChengDu,China

Transformer

LLMS

点积(Dot Product)

给定两个向量x,yRd\mathbf{x},\mathbf{y}\in\mathbb{R}^d, 它们的点积(dot product)xy\mathbf{x}^\top\mathbf{y} (或x,y\langle\mathbf{x},\mathbf{y}\rangle) 是相同位置的按元素乘积的和:xy=i=1dxiyi\mathbf{x}^\top \mathbf{y} = \sum_{i=1}^{d} x_i y_i

Encoder

目的: 对输入序列进行更好的向量表示

Embedding

用向量表示文字(词表+位置)

架构图上的Input Embedding也被成为Token Embedding

Embedding = Input Embedding(Token Embedding) + Position Embedding

Positional Encoding

将文字的位置编码加上Input Embedding向量,得到新的向量表示。

正弦和余弦位置编码、ROPE等

RoPE(Rotary Positional Encoding)是一种创新的位置编码方法,旨在改进Transformer模型中位置信息的处理方式。与传统的绝对位置编码不同,RoPE通过旋转矩阵的方式将位置信息直接嵌入到词向量的计算过程中,特别是在自注意力机制中。

自注意力机制

描述前文对下一个Token的影响。

WQW^Q,WKW^K,WVW^V是三个可训练的参数矩阵

Q=XWQQ=XW^Q

K=XWKK=XW^K

V=XWVV=XW^V

Attention(Q,K,V)=softmax(QKdk)V Attention(Q,K,V)=\mathrm{softmax}\left(\frac{\mathbf Q \mathbf K^\top }{\sqrt{d_k}}\right)V

将上述的向量分别与其他向量做点积运算获得权重,然后将权重值再与对应的其他向量做乘法后相加,得到最后的向量表示。

多头注意力相当于把多个单头进行拼接后,做线性变换。

残差结构

变换前的向量和变换后的向量相加,解决梯度消失问题。

归一化线性变换

FNN(X)=ReLu(Xw1+b1)w2+b2FNN(X) = ReLu(Xw_1+b_1)w_2 + b_2

Decoder

Masked Muti-Head Attention

一个Token只能与前面的Token计算相关性,而不能与其后面的词计算相关性。 (只能看过去,不能看未来)

交叉自注意力机制

与自注意力不同,这里的QQ来自Decoder当前部分的输出,而KK,VV来自整个Encoder的输出。

主流模型结构发展

梳理下大语言模型的网络结构,及对应相关的任务。

LLMS

架构代表模型任务
Encoder modelsBERT ALBERT RoBERTa句子分类、命名实体识别、提取式问答(extractive question answering)
Decoder modelsGPT文本生成任务
Encoder-decoder modelsBART T5总结、翻译或生成性问答

微调deepseek-r1蒸馏版工具调用

· 阅读需 6 分钟
Danny He
Developer in ChengDu,China

有关deepseek-r1蒸馏版的微调方案,目前主流在用<think></think>的形式组织相关语料样本,目前还未涉及到工具调用(Function-Call)的形式, 刚好同事需要基于LLaMA-Factory构建思维链的工具调用语料,于是我顺便补充了一下LLaMA-Factory关于chat template的单元测试,以推导出LLaMA-Factory中关于样本集处理以及抛开JSON格式理解本质chat template。 思维不要固化。

多个docker-compose配置的管理思路

· 阅读需 3 分钟
Danny He
Developer in ChengDu,China

服务上经常部署多个docker-compose配置文件的项目,比如算法服务器同事部署了ragflowvllmwhisper等项目,经常需要重启或关闭,算力有限:( 这里提供一个管理多个docker-compose配置文件的思路.

docker通过代理pull镜像

· 阅读需 3 分钟
Danny He
Developer in ChengDu,China

通过代理下载docker镜像

Clash安装

安装Linux版本的Clash,并配置ui界面,关键配置

external-controller: 0.0.0.0:9090
secret: "123qwe"
external-ui: "ui"
  • external-controller代表外部访问地址,此处意思为允许所有人从9090端口访问(当然需要开启9090端口)
  • secret访问密钥,不设置密钥的话任何人都可以访问,较为危险
  • external-ui ui文件的路径,由于此处config.yaml文件和ui文件夹在同一目录下,所以只需文件夹名称即可

ui文件下载

git使用技巧汇总

· 阅读需 1 分钟
Danny He
Developer in ChengDu,China

别名:更方便的使用命令

配置git使用别名

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

介绍下StorIOSQLite到RxJava

· 阅读需 7 分钟

storio简介

storio是github上的开源项目,它用来操作SQLiteDatabaseContentResolver的操作进行封装,提供更简单更强大的api.我们项目最近从xutils3转换为StorIOSQLite,说说对它的体验和它是如何使用RxJava进行封装.

2017开篇:curl使用备忘

· 阅读需 2 分钟

真的好久没写东西了,主要原因是去年下半年太忙了,忙着找工作忙着边学边做Android... 这里备注一下curl的使用,因为项目原因发布新版本的时候需要将编译后的APK文件上传到统一的版本管理后台.

不同平台下的项目自动打包方式

· 阅读需 6 分钟
Danny He
Developer in ChengDu,China

iOS

iOS下的打包主要由xcodebuild来完成.在xcode 7以前我通过xcodebuild构建项目然后通过xcrun来生成ipa文件. 类似以下命令

xcodebuild -configuration ${BuildConfig} -target "${TargetName}" GCC_PREPROCESSOR_DEFINITIONS="\${GCC_PREPROCESSOR_DEFINITIONS} FREEVERSION=0" WARNING_LDFLAGS="\${WARNING_LDFLAGS} -w" CODE_SIGN_IDENTITY="${DistributionCodeIdentity}" PROVISIONING_PROFILE="${DistributionProvision}"
xcrun -sdk iphoneos PackageApplication -v "${ProductDir}/${TargetName}.app" -o "${PrjDir}/${IpaName}"

这种方式打包有很多局限:

说说Core Graphics

· 阅读需 4 分钟

记得11年左右做iOS开发的人真不多,大环境下大家学习iOS开发基本都靠WWDC和国外的文献,近几年随着iOS开发的火爆,好多技术都被挖掘出来(其实是自己以前英文不好,好多东西都是点到为止),最近比较闲重新看了下iOS相关的一些东西.感觉有些东西虽然不是常用的,但明白后可以更灵活的运用到日常的开发中.这里记录下我对iOS里一些特性理解.

广义的离屏渲染?

首先看GPU屏幕渲染两种方式:

  • On-Screen Rendering:意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。
  • Off-Screen Rendering:意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。

以ABS宏为例说说Clang中的宏定义方式技巧

· 阅读需 6 分钟

我们在iOS开发的时候经常使用宏定义,最常用的宏肯定是DEBUG,像下面这样:)

#if DEBUG
...
#endif

#if __has_feature(objc_arc_weak)
...
#elif __has_feature(objc_arc)
...
#else
...
#endif

#if (TARGET_OS_MAC || TARGET_OS_IPHONE)
...
#endif

记录下我对Clang中定义的宏ABS的理解(从零开始的理解),它的作用很简单:得到一个数的绝对值

Cocos2dx使用ETC1+Alpha压缩纹理

· 阅读需 11 分钟

我们为了优化游戏的内存占用,会给图片资源进行有损压缩,在Android上则是使用ETC1(Ericsson texture compression)进行纹理压缩,压缩纹理无论从加载速度(GPU识别)和内存占用都有很大的优势,唯一的缺点就是有损。 也就是它不是万金油,并不是所有的图片都能使用ETC1压缩。我在记录下我是如何在Cocos2dx中使用ETC1进行纹理压缩.当然这里是在android平台下使用。

quick的ScrollView随想

· 阅读需 6 分钟

一直使用quick。之前一直忙着做项目,都没有空停下来好好想想OpenGL的一些知识.今天和同事分析了下ClippingNode的实现,记录在这里。

quick的尴尬

quick用裁剪测试,实现了一个lua版的UIScrollView.lua,可以满足简单的裁剪和滑动需求.

(cpp)cx中将string转换成GUID

· 阅读需 1 分钟
#include <windows.h>

using namespace Windows::ApplicationModel::Store;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;

Platform::String^ transactionId = "{xxxxx}"; //从微软的内购中获取的订单号字符串
GUID guid;
HRESULT hr = IIDFromString(transactionId->Data(), &guid);
if (SUCCEEDED(hr)) {
Platform::Guid guid_transactionId(guid);
auto fuillAsync = CurrentApp::ReportConsumableFulfillmentAsync(productId, guid_transactionId); //完成订单
}

如何计算git变动的文件大小

· 阅读需 1 分钟
#!/bin/bash
# The tool to get the total size of autoupdate
# by Dannyhe

function NotSupport()
{
echo "Not support $OSTYPE"
exit -1
}

function main()
{
echo "os: $OSTYPE"
echo "size:"
if [[ "$OSTYPE" == "linux-gnu" ]]; then
NotSupport
elif [[ "$OSTYPE" == "darwin"* ]]; then
# Mac OSX
git log --name-status -1 | grep -E '^[A-Z]\b' | sort -k 2,2 -u | grep -E "M|A" | awk '{print $2}' | xargs stat -f "%z" | awk '{t+=$0}END{print t/(1024*1024)" Mb"}'
elif [[ "$OSTYPE" == "cygwin" ]]; then
# POSIX compatibility layer and Linux environment emulation for WindowsNotSupport
NotSupport
elif [[ "$OSTYPE" == "msys" ]]; then
# Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
git log --name-status -1 | grep -E '^[A-Z]\b' | sort -k 2,2 -u | grep -E "M|A" | awk '{print $2}' | xargs du -b | awk '{t+=$0}END{print t/(1024*1024)" Mb"}'
elif [[ "$OSTYPE" == "freebsd"* ]]; then
NotSupport
else
NotSupport
fi
}

main

Sublime Text 3 License Key - CRACK

· 阅读需 1 分钟

Sublime Text 3 Build 3103 License Key - CRACK

—– BEGIN LICENSE —–
Michael Barnes
Single User License
EA7E-821385
8A353C41 872A0D5C DF9B2950 AFF6F667
C458EA6D 8EA3C286 98D1D650 131A97AB
AA919AEC EF20E143 B361B1E7 4C8B7F04
B085E65E 2F5F5360 8489D422 FB8FC1AA
93F6323C FD7F7544 3F39C318 D95E6480
FCCC7561 8A4A1741 68FA4223 ADCEDE07
200C25BE DBBC4855 C4CFB774 C5EC138C
0FEC1CEF D9DCECEC D3A5DAD1 01316C36
—— END LICENSE ——

—– BEGIN LICENSE —–
Nicolas Hennion
Single User License
EA7E-866075
8A01AA83 1D668D24 4484AEBC 3B04512C
827B0DE5 69E9B07A A39ACCC0 F95F5410
729D5639 4C37CECB B2522FB3 8D37FDC1
72899363 BBA441AC A5F47F08 6CD3B3FE
CEFB3783 B2E1BA96 71AAF7B4 AFB61B1D
0CC513E7 52FF2333 9F726D2C CDE53B4A
810C0D4F E1F419A3 CDA0832B 8440565A
35BF00F6 4CA9F869 ED10E245 469C233E
—— END LICENSE ——

—– BEGIN LICENSE —–
Anthony Sansone
Single User License
EA7E-878563
28B9A648 42B99D8A F2E3E9E0 16DE076E
E218B3DC F3606379 C33C1526 E8B58964
B2CB3F63 BDF901BE D31424D2 082891B5
F7058694 55FA46D8 EFC11878 0868F093
B17CAFE7 63A78881 86B78E38 0F146238
BAE22DBB D4EC71A1 0EC2E701 C7F9C648
5CF29CA3 1CB14285 19A46991 E9A98676
14FD4777 2D8A0AB6 A444EE0D CA009B54
—— END LICENSE ——

—– BEGIN LICENSE —–
Alexey Plutalov
Single User License
EA7E-860776
3DC19CC1 134CDF23 504DC871 2DE5CE55
585DC8A6 253BB0D9 637C87A2 D8D0BA85
AAE574AD BA7D6DA9 2B9773F2 324C5DEF
17830A4E FBCF9D1D 182406E9 F883EA87
E585BBA1 2538C270 E2E857C2 194283CA
7234FF9E D0392F93 1D16E021 F1914917
63909E12 203C0169 3F08FFC8 86D06EA8
73DDAEF0 AC559F30 A6A67947 B60104C6
—— END LICENSE ——

rsync在Windows上的权限问题

· 阅读需 1 分钟
Danny He
Developer in ChengDu,China
rsync -ravc --exclude=.DS_Store* --exclude=.git/ --exclude=.gitignore 源路径 目标路径 --delete-after --perms --chmod=a=rw,Da+x

对Android的Gradle插件的理解

· 阅读需 4 分钟

本来打算写一篇关于Android的gradle插件的使用详解之类的文章,结果在知乎看到了一篇不错的。我在这里总结下吧。

http://ghui.me/post/2015/03/create-several-variants

开始

  1. 合并的思想

    新的构建系统最主要的想法就是合并,将各自Productflavor定义的不同项目配置(applicationId,versionCode,signingConfig,sourceSets...)以及资源(java代码,AndroidManifest.xml,res,jni...)和公用的defaultConfig定义的配置、sourceSets.main定义的资源进行合并

最简单的方法将iOS中的NSLog写入文件

· 阅读需 1 分钟
#ifdef DEBUG
- (void) redirectConsoleLogToDocumentFolder {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"iOS.log"];
freopen([logPath cStringUsingEncoding:NSUTF8StringEncoding],"a+",stderr);
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *time = [formatter stringFromDate:[NSDate date]];
NSLog(@"-------------- Start Log [%@] --------------",time);
[formatter release];
}
#endif

在程序启动的时候调用即可,所有的NSLog日志都会记录到documents下的iOS.log内

#ifdef DEBUG
[self redirectConsoleLogToDocumentFolder];
#endif

Python打印的一个例子

· 阅读需 2 分钟

用python肯定是为了跨平台的便利,用python时在不同平台打印需要注意的地方。

Windows和mac的终端编码不一样,尤其是在打印中文的时候

我采用的方法是在windows下将编码转换为gbk

打印时候最好能加上颜色

使用colorama这个库来实现

lua简单遍历字符串字符

· 阅读需 1 分钟
function string_foreach(str,func)
str:gsub(".", function(c)
func(c)
end)
end

local test = 'abcd'

string_foreach(test,function(char)
print(char)
end)

Visual Studio相关

· 阅读需 1 分钟

安装部分

VS2013序列号

Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9

Visual Studio Premium 2013 KEY(密钥):FBJVC-3CMTX-D8DVP-RTQCT-92494

Visual Studio Professional 2013 KEY(密钥): XDM3T-W3T3V-MGJWK-8BFVD-GVPKY

Team Foundation Server 2013 KEY(密钥):MHG9J-HHHX9-WWPQP-D8T7H-7KCQG

VS2015序列号

专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2 企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV