天涯 = tianyaclub.net
天涯 是一个全球华人分享和交流的地方
现在注册
已注册用户请  登录
😊天涯最新网址→ tianya666.com tianya666.net 点击查看说明 天涯秘籍
手机浏览器访问网址,自适应移动端屏幕查看
😊你好呀朋友→了解天涯 帮助文档 使用指南
天涯发帖消耗社区币,每日登录免费领取
知之为知之,不知为不知,是知也。
😊好好说话→ 在一个公共空间的公共讨论中,我们应该关注的,是自己能够在这些讨论中提供什么样的建设性增益,而不是那些纯粹个人的感受。好好说话,不要把戾气宣泄于他人。
永远喜欢幼刀 · 2025年12月12日 20:38 · 570 次点击
这是一个创建于 295 天前的主题,其中的信息可能已经发生改变。

開個新的主題記錄一下學習LLM的一些筆記~

不是什麽專業的,還沒有系統學習過大學相關課程,所以只是淺嘗即止的摸索,如果有大佬看到哪裏不對,還請多多指點(輕噴,拜托!)
由於我不會Python和Pytorch所以只能暫時用C手搓了,如果有C大佬看到代碼的錯誤與漏洞也歡迎指出,非常感謝!

2025年12月12日 20:38
需要 后方可回复,如果您还没有账号请
2 条回复  •  2025年12月12日 23:00
  1. 永远喜欢幼刀永远喜欢幼刀
    OP
    2025年12月12日 20:45
    1

    筆記零 —— 爲什麽使用C語言

    正如上面寫的我不太會Python和Pytorch,之後也不太打算學習,所以就用C來手搓了(而且也能瞭解一些底層的原理)。

    對於C語言,由於Linux和Windows的一些區別,所以我打算只是用C標準庫的内容,不使用POSIX和Windows特有的東西,這樣也方便想測試和調教代碼的兄弟了。我會在Linux和Windows上都進行編譯,以保證兩個系統都能夠運行。

    源代碼的話等寫道一定量之後再放到GitHub上吧。

    開這麽一個主題也是激勵我自己堅持下去。

  2. 永远喜欢幼刀永远喜欢幼刀
    OP
    2025年12月12日 23:00
    2

    筆記一 —— Tokenizer

    我打算先從Tokenizer開始,因爲這比直接去生啃《Attention Is All You Need》等論文要簡單。

    任何語句在LLM中都會變成一個個Token,token 可能是字符、字节或子词,而Token都有一個獨有的ID,這個ID就是由Tokenizer來的。
    现代LLM还可能使用WordPiece、SentencePiece等变体,但暫時只用BPE舉例。
    BPE(Byte-pair encoding)是由Philip Gage在1994年提出的算法,原本是用於數據壓縮的,但是其變種被用於LLM。

    接下來開始直接寫代碼(僞代碼)吧,我不太會講,但是代碼應該會比較直觀。
    (由於不能開頭直接寫空格所以只能用|了)

    { Key, Id } Vocab
    int WordSeq[]
    int[2] PairFreq[]

    Function BPE_Block(char* buffer):
    | for c in buffer:
    | | if c not in Vocab:
    | | | add_to_vocab(c)
    | | add_to_wordseq(get_id(c))
    | for w in WordSeq[0..len-1]:
    | | inc_pair(w, w+1)
    |
    | move_last_word_to_first()
    | free_wordseq_without_first()

    Function BPE():
    | while Vocab.size < target and still_has_pairs():
    | | for block in ctx:
    | | | BPE_Block(block)
    | | add_to_vocab(get_key(get_most_pair()[0])+get_key(get_most_pair()[1]))
    | | free_pairfreq()

    我的思路是按塊處理語料,然後多次處理語料,處理完一次語料合并一次token,也就是每轮重新遍历语料块统计pair,更新vocab,這樣可以在有限内存中處理大語料了。

    運行的效果大致是這樣的:
    aaabdaaabac
    1:vocab:{a:0, b:1, d:2, c:3}
    2:vocab:{a:0, b:1, d:2, c:3, aa:4}
    3:vocab:{a:0, b:1, d:2, c:3, aa:4, aaa:5}
    4:vocab:{a:0, b:1, d:2, c:3, aa:4, aaa:5, aaab:6}
    ...

    這會產生字詞,且大多數情況會有意義,例如playing、played可能會變成pl、ay、play、ing、ed。
    BPE算法的好處就是可以生成不在語料中的單詞,加入語料中沒有unplayable,但是有un、play、able,模型就能生成unplayable。
    還有一個好處就是可以很好的處理多語言,將上述僞代碼中的c以utf-8的字符為最小單位則就可以。

    至於實際C代碼等我寫好再以照片的形式貼上來吧。
    (但願有人一起討論)

添加新回复
5000
如果您要教别人做事,请确认那件事情是您自己确实已经做过并且做得很好的
← tianyaclub.net