【HCIE-AI】7.Tokenizer 详解

「文智助手」全场景办公AI助理AI+OPC全流程实践方案(大赛作品) 阅读详情

Tokenizer 详解


目录

  1. 本质问题:为什么需要 Tokenizer?
  2. Tokenizer 的三种"切法"——按粒度分
    • 2.1 Word-level(单词级)
    • 2.2 Char-level(字符级)
    • 2.3 Subword(子词级)⭐ 业界标准
  3. 三种主流 Subword 算法——按"怎么切"分
    • 3.1 BPE(Byte Pair Encoding)—— 最主流、GPT 系列在用

1. 本质问题:为什么需要 Tokenizer?

一句话:模型只认识数字,不认识文字。Token 是文本和数字之间的"翻译单位"。

"我今天学习了反向传播"
        ↓ Tokenizer
[12875, 392, 561, 18903, 6521, 98]  ← token IDs(一串整数)
        ↓ Embedding 层
[[0.12, -0.34, ...], [...], ...]     ← 向量(模型真正能处理的东西)

没有 Tokenizer,模型连一个汉字都读不懂。它是所有 NLP 模型的入口。

核心的 “翻译” 过程

输入文本 → Tokenizer → Token IDs → Embedding → 模型计算
              ↑
          词典(vocabulary / vocab)

Tokenizer 做的事情本质上就是查词典:

  • 编码(Encode):文本 → Token IDs
  • 解码(Decode):Token IDs → 文本
  • 可逆性要求:理想情况下,编码再解码应该完全还原原文

Tokenizer 做决策的关键问题

任何一个 Tokenizer 都要回答三个问题:

  1. 切多细?——按词切?按字切?还是按中间粒度切?
  2. 词表多大?——几万个还是几十万个?
  3. 没见过的新词怎么办?——是抛异常?还是能"拼"出来?

这三个问题的不同回答,就衍生出下面三种切分方法。


2. Tokenizer 的三种"切法"——按粒度分

三种方式对应三个不同层级的切分单位。

───────────────────────────────────────────────────────────
  方法        | 粒度  |     例子:"我爱机器学习"
───────────────────────────────────────────────────────────
  Word-level  | 单词级 | ["我", "爱", "机器", "学习"]  ← 按词切
  Char-level  | 字符级 | ["我", "爱", "机", "器", "学", "习"]  ← 按单字切
  Subword     | 子词级 | ["我", "爱", "机器", "学习"]  ← 按"最常用的片段"切
───────────────────────────────────────────────────────────

2.1 Word-level(单词级)

核心思路:按自然语言的"单词"为单位切分。英文以空格和标点为界,中文需要额外分词器。

英文:
  "I love machine learning"
    → ["I", "love", "machine", "learning"]

中文(需分词工具,如 jieba):
  "我爱机器学习"
    → ["我", "爱", "机器", "学习"]

词表规模:

英文:约 50 万+ 单词(包含所有变形)
  run, runs, running, ran — 4 个独立的词
  unbelievable, believable, believe — 3 个独立的词

中文:理论上无限(组合词太多)
  学习、学会、学好、学完、学成、学以致用...
优点缺点
直觉最自然,每个 token 语义完整词表极大(英文 50 万+)
实现简单遇到未登录词(OOV)直接认不出
人类可理解性最强“run”/“running”/“ran” 被当成三个完全不同的词
中文需要额外分词工具,且边界划分有歧义

OOV(Out-of-Vocabulary)(超出词表外的字词)问题:

词表里只有:word-level 级别的常见词

实际遇到:
  "tokenizationalization" ← 不在词表中
  → OOV!模型不认识
  → 只能用 UNK(Unknown)特殊 token 替代
  → 信息丢失了!

结论:Word-level 在开放场景下不可行。

现实:GPT / LLaMA / Qwen 都不用 Word-level。词表太大 + OOV 问题无解。


2.2 Char-level(字符级)

核心思路:以单个字符(字母/汉字)为单位切分。词表极小。

英文:
  "unbelievable"
    → ["u", "n", "b", "e", "l", "i", "e", "v", "a", "b", "l", "e"]
  "I love ML"
    → ["I", " ", "l", "o", "v", "e", " ", "M", "L"]

中文(天然适合,因为汉字本身就是字符):
  "我爱机器学习"
    → ["我", "爱", "机", "器", "学", "习"]

词表规模:

英文:26 字母 + 大小写 + 数字 + 标点 + 空格 ≈ 200 个 token
中文:常用汉字约 6,763 个(GB2312 一级 + 二级)
      全部 CJK 统一汉字约 80,000+
中文用字符级的话词表要比英文大得多
优点缺点
词表极小(英文 ~200)序列极长(1 个单词变 12 个 token)
没有 OOV 问题(任何字符都能表示)注意力计算量是序列长度的平方增长
任何语言、任何特殊符号都能处理单个字符几乎没有语义信息
跨语言一致性(统一处理)模型难以学到"单词"级别的模式

序列长度问题:

同样是 100 个英文单词的段落:
  Word-level: ≈ 100 tokens(含标点)
  Char-level: ≈ 500-600 tokens(平均每个单词 5-6 个字母)

Transformer 自注意力是 O(n²) 复杂度:
  Word-level: 100² = 10,000 次计算
  Char-level: 600² = 360,000 次计算 → 36 倍!

这意味着:同样的计算资源下,Char-level 只能处理 Word-level 1/6 的文本长度。

现实:极少直接使用。Transformer 的序列长度是瓶颈,用太多 token 表示一段文本太浪费。


2.3 Subword(子词级)⭐ 业界标准

核心思想:常用词不分(保留语义),生僻词切成已知片段(解决 OOV)。平衡了 Word-level 和 Char-level 的优缺点。

"unbelievable" → ["un", "believe", "able"]  ← 3 个已知子词
"believable"   → ["believe", "able"]        ← 2 个已知子词
"特朗普"       → ["特朗", "普"]             ← 2 个高频汉字片段(BPE 训练后合并)

处理未登录词(这是 Subword 最强大的能力):

"tokenizationalization"

情况 A:这个词不在词表中(Word-level → OOV ❌)
情况 B:每个字母拆开(Char-level → 13 个 token,太长 ❌)
情况 C:Subword 切分
  → ["token", "ization", "al", "ization"]
  → 4 个 token,每个都在词表里 ✓
  → 意思保留:"token" + "化" + "的" + "化"(大致可理解)
优点缺点
词表可控(典型 8k-128k 大小)切分结果有时违反直觉
无 OOV 问题(生僻词也能"拼"出来)相同词在不同上下文中可能被不同切法
序列长度适中(比 Word-level 略长,远短于 Char-level)多语言场景下低频语言编码效率低
平衡了语义完整性和词表大小训练 Tokenizer 需要大量语料

为什么 Subword 能成为业界标准?

三者的量化对比(同一段英文 100 词):

             词表大小    序列长度    OOV处理    语义密度
Word-level     50k+      ~100       ❌          ⭐⭐⭐
Char-level     ~200      ~500       ✓           ⭐
Subword        32k       ~120       ✓           ⭐⭐⭐
              ↑          ↑          ↑
           合理大小    几乎不膨    无死角覆盖

Subword 在三者中找到了最佳平衡点。

Subword 的"反向"理解:

如果你学过"词根词缀"背单词,你就已经理解 Subword 了:

  "unlockable" = "un" + "lock" + "able"
    → 不认识这个词?没关系,三个子词你都认识
    → 组合意思:"不能" + "锁" + "能够" → "可以解锁的"

  Transformer 的 Subword Tokenizer 做的也是类似的事:
  把词汇拆成"语素"级别的片段,组合使用。

3. 三种主流 Subword 算法——按"怎么切"分

上文我们讲了 Subword “是什么”——它是介于单词和字符之间的切分粒度。接下来讲 Subword “具体怎么切”——有三种算法,分别被不同模型家族采用。

Subword 算法三大家族:
  BPE(Byte Pair Encoding)          ← GPT / LLaMA / Qwen / StableLM
  Unigram                            ← T5 / Gemma / SentencePiece 默认
  WordPiece                          ← BERT / ELECTRA

3.1 BPE(Byte Pair Encoding)—— 最主流

提出:Neural Machine Translation of Rare Words with Subword Units (Sennrich et al., 2016)

使用模型:GPT 全系列(GPT-2/GPT-3/GPT-4)、LLaMA 1/2/3、Qwen、DeepSeek、StableLM 等——绝大多数当前主流模型。


3.1.1 原理:自底向上的合并

一句话:从字母/单字开始,逐步合并出现频率最高的相邻字节对。

训练过程图解:

Step 0:初始状态
  词表 = 所有单字符(26 字母 + 标点 + 空格等)
  语料 = "low low low low low lower lowest"

Step 1:拆成字符
  l o w _ l o w _ l o w _ l o w _ l o w _ l o w e r _ l o w e s t
  ("_" 表示空格)

Step 2:统计相邻 pair 频率
  (l, o): 出现 8 次 ← 假设数字
  (o, w): 出现 8 次
  (w, _): 出现 5 次
  (w, e): 出现 2 次
  ...
  最高频的 pair: (l, o) 或 (o, w)

Step 3:合并最高频 pair
  假设 (l, o) 是最高频 → 合并为 "lo"
  词表新增 "lo"
  语料变成:lo w _ lo w _ lo w _ lo w _ lo w _ lo w e r _ lo w e s t

Step 4:继续统计、合并
  现在 (lo, w) 出现 8 次 → 合并为 "low"
  词表新增 "low"
  语料变成:low _ low _ low _ low _ low _ low e r _ low e s t

Step 5:继续
  (low, _) 出现 5 次 → 合并 "low_"
  (e, r) → 合并 "er"
  (e, s) → 合并 "es"
  (es, t) → 合并 "est"
  ...

Step 6:停止
  当词表大小达到预设值(如 32,000)时停止训练
  最终词表 = {..., "low", "low_", "er", "est", ...}

核心要点:

训练完成后,BPE 的"贪婪"解码规则:
  → 对输入文本,从左到右,优先匹配词表中"最长"的子词
  → 匹配不上就逐字符回退

例子(假设词表里有 "low" 但没 "lower"):
  "lower" → 从左往右匹配
    "l" → 不是最长,继续
    "lo" → 有 "low"?→ 匹配 "low" ✓
    剩下 "er" → 匹配 "er" ✓
  → 结果:["low", "er"]

3.1.2 实际案例:GPT 系列的编码表现

英文编码效率:

GPT-4(≈100k 词表):
  "hello world"          → [15339, 1917]        ← 2 个 token
  "Hello World"          → [15496, 21592]       ← 2 个不同 token!大小写敏感
  "the quick brown fox"  → [9, 9, 9, ...]       ← 高频词各占 1 个 token
  "antidisestablishment" → 未知词 → 切成子词     ← 不会 OOV

英文平均效率:约 3.5-4.5 字符/token

中文编码效率(在 GPT 这种"英文优化"的 Tokenizer 下):

GPT-4(中文编码效率较差——这是 GPT 的已知弱点):
  "我在学习反向传播"
    → 每个中文字几乎各占 1-2 个 token
    → 约 8-12 个 token

  对比 Qwen 2.5(中文优化 Tokenizer):
    "我在学习反向传播"
    → "我" + "在" + "学习" + "反向传播"
    → 约 4-5 个 token

结论:GPT 的中文效率约为 1.5-2 chars/token
而 Qwen 可以达到 4-5 chars/token
→ 同样的中文文本,GPT 要多花 2-3 倍的价格!

GPT-4o 的 Tokenizer 更新(2024):

旧版 GPT-3.5 的 p50k_base:
  "gpt"       → ["g", "pt"]     ← 被切开了!
  "ChatGPT"   → ["Chat", "GPT"] ← 还可以
  "api"       → ["api"]         ← 完整

新版 GPT-4o 的 o200k_base:
  "gpt"       → ["gpt"]         ← 作为一个完整 token ✓
  "ChatGPT"   → ["Chat", "GPT"] ← "GPT" 作为整体 ✓
  "api"       → ["api"]         ← 完整

词表从 ~100k 扩展到 ~200k
常见 AI 相关术语被保留为完整 token
编码效率整体提升 10-20%

3.1.3 代码场景的 BPE 表现

BPE 在代码 + 自然语言混合场景下有一些特殊现象:

# Python 代码的 tokenization
"def fibonacci(n):"     → 可能保持完整,因为 "def" 是高频词
"softmax_attention"     → ["softmax", "_", "attention"] 或 ["soft", "max", "_attention"]
"__init__"              → ["_", "_", "init", "_", "_"]  ← "dunder" 方法常被切成碎片

代码和自然语言混合的挑战:

挑战 1:空格和缩进
  Python 用缩进表示代码块
  如果 Tokenizer 把连续空格/缩进合并了,代码语义就变了
  解决方案:保留空格作为单独 token,或在 Pre-tokenizer 阶段特殊处理

挑战 2:命名约定
  snake_case:    "tokenizer_config"  → 下划线作为分隔符
  camelCase:     "tokenizerConfig"   → 大写字母作为隐式分隔
  PascalCase:    "TokenizerConfig"   → 大写开头作为隐式分隔
  BPE 对这些命名约定的处理方式不同,影响代码理解效率

挑战 3:数字
  "1234567890"  → BPE 可能切成 ["123", "456", "7890"]
  → 模型"看到"的是碎片化的数字,而不是完整数字
  → 影响数学计算能力
  → 解决方案:split_digits=True — 每个数字独立成 token

3.1.4 GPT-4o 的"被切开的单词"特征表

以下是一些实际测试的常见词汇的 token 分解情况(基于 o200k_base):

完整 token(1 个 token):
  GPT, AI, chat, api, token, model, data, train, test, python, java
  hello, world, transformer, attention

被切开的(2+ 个 token):
  tokenization    → ["token", "ization"]
  finetuning      → ["fine", "tuning"]
  reinforcement   → ["reinforce", "ment"]
  bidirectional   → ["bi", "direction", "al"]
  parameter       → ["para", "meter"] 或完整
  initialization  → ["initial", "ization"]

这些切分方式有些符合语言学直觉(如 "token" + "ization"),
有些则完全出于统计频率(如 "bi" + "direction" + "al")。

3.1.5 BPE 的优缺点总结
优点缺点
原理简单、训练高效贪心匹配,不是全局最优切分
词表大小可控相同词在不同上下文可能被不同切法
无 OOV 问题对中文等非空格语言不友好(需预处理)
经验证明效果最好(GPT/LLaMA 都用)低频 token 可能出现"浪费"
实现成熟(tiktoken / HuggingFace 都支持)训练语料分布偏差会影响合并结果

为什么 BPE 是事实标准?

不是因为它理论最优(Unigram 理论上更优雅),而是因为经验最优——OpenAI 在 GPT-2/GPT-3 上大规模验证了它的有效性,后来 LLaMA/Qwen/DeepSeek 跟进,形成了生态效应。工具链(tiktoken、HuggingFace tokenizers)也围绕 BPE 最成熟。


3.1.6 与 Unigram / WordPiece 的前瞻对比(概要)
维度BPEUnigramWordPiece
合并方向自底向上(合并)自顶向下(裁剪)自底向上(合并)
合并/保留标准出现频率损失函数减少量互信息(PMI)
是否概率模型否是否
训练速度快中中
代表模型GPT / LLaMA / QwenT5 / GemmaBERT / ELECTRA
中文支持需配合 Pre-tokenizer原生支持更好(SentencePiece)需配合预处理

附录:关键概念快速索引

概念一句话解释
Token文本切分后的最小单位(可能是词、字符或子词)
Token ID每个 Token 对应的整数编号(词典中的索引)
词表Token 到 ID 的映射字典(Vocabulary)
OOV词表中不存在的词(Out-of-Vocabulary)
UNK代替 OOV 的特殊 token(Unknown)
BPE自底向上合并高频子词的算法
Pre-tokenizer正式训练前的粗切分(如空格 + 标点分割)
Encoder文本 → Token IDs 的过程
DecoderToken IDs → 文本的过程
编码效率每个 token 平均能表示多少字符(chars/token)
船载 OpenHarmony AIS 航海工作台:告警与防碰撞预警系统 船载OpenHarmony AIS航海工作台的告警与防碰撞系统,集成十余类告警(超速、偏航、会遇、SOS等),通过网格空间索引实现高效邻近判定,保障实时性。告警管理器统一调度规则、去重、通知与日志,支持悬浮球、语音、跑马灯、弹窗多渠道触达,确保航行安全。SOS紧急通道独立运行,避免干扰。系统设计强调性能优化与多场景适配,为航海安全提供核心支撑。 阅读详情

相关推荐

AI 应用开发:四维架构落地实战——以 HR Agent 为例拆解感知·推理·记忆·执行【意图路由、规划编排、长期记忆、工具执行、面试题】

本文基于四维架构(感知·推理·记忆·执行),以HR Agent为例,系统拆解大模型应用从“聊天”到“生产可用”的落地路径。通过Spring AI实现意图路由、规划编排、RAG检索与工具调用,结合真实踩坑复盘,揭示架构化设计对安全、成本与可维护性的关键价值,为AI Agent工程化提供可复用的实战框架。

王大师企业官方博客 165

【HCIE-AI】10.昇腾 模型迁移分析

昇腾NPU迁移分析工作指南 摘要:本文档详细介绍了从GPU平台迁移到昇腾NPU平台的全流程分析方法。主要内容包括: 前置工作:建立GPU基线(精度/性能指标),搭建昇腾环境并验证基础功能 核心分析: 使用msFmkTrans工具扫描API兼容性(支持/部分支持/不兼容) 检查三方库(如transformers/deepspeed)适配情况 动态Shape识别与优化建议 亲和API替换建议(性能提升20%+的优化机会) 工具链:涵盖静态分析(msFmkTrans)、运行时验证(Shape Dump)、性能分析

2201_75633021的博客 308

c++实现异步线程池并详细分析线程池析构流程

多线程编程是提高程序性能和响应能力的关键技术之一,异步线程池作为多线程编程的一种有效实现方式,能够管理和复用线程资源,避免频繁创建和销毁线程带来的开销。在本文中,我们将深入探讨如何实现一个异步线程池。

2301_76564925的博客 1599

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 248

ESP32-P4实战:LVGL V9.4 PPA加速配置与性能对比

本文详细介绍了如何在ESP32-P4平台上配置LVGL V9.4的PPA硬件加速功能,通过启用PPA加速显著提升图形处理性能并降低CPU占用率。文章包含环境准备、配置步骤、性能对比及常见问题解决方案,帮助开发者高效利用ESP32-P4的PPA加速器优化嵌入式GUI应用。

rice5的博客 1191

MinerU与Docling:智能文档处理框架对比

本文对比分析了MinerU和Docling两大智能文档处理框架。MinerU专注于高精度PDF解析,采用多模态AI技术,在学术文献、金融报表等复杂文档处理上表现优异;Docling则定位企业级多格式文档处理平台,支持10+格式转换,更适合文档管理系统等场景。技术层面,MinerU基于VLM模型实现端到端处理,Docling采用插件化多后端架构。性能测试显示MinerU精度更高(95%+),但资源消耗较大;Docling处理速度更快(1-3秒/页),部署更灵活。

轩哥的个人研究和成长记录 1913

我用 GPUWorks 在 M1 Pro 上搭了个发票识别原型

公司里经常要看电子发票。我想先做个小原型:把 PDF 发给一个自己部署的图文模型,让它提取发票类型、日期、交易双方和金额,再把结果交给同事核对。这个原型不用先接财务系统,先看看从部署到调用要走多少步,模型返回的内容能不能帮上忙。

鸽芷咕的博客 2万+

Linux 内核中 ARP 协议的全链路解析:从触发机制到物理层发送

核心设计思想按需解析:减少不必要的 ARP 请求,降低网络负载。分层解耦:协议栈各层(邻居子系统、Netfilter、驱动)职责分离,提高扩展性。ARP的核心作用是将IP映射为MAC地址,确保数据链路层能正确封装帧。其触发时机围绕“未知MAC地址需求”展开,覆盖通信初始化、缓存更新、网络变更及维护等多种场景。

数字人生 367

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 509

Android功耗系列专题理论之六:外设功耗问题分析方法

本文介绍了移动设备功耗问题的分析方法,重点针对传感器和GPU两大模块。传感器部分详细讲解了通过ADB命令获取日志、状态差异分析和单传感器隔离测试的排查方法,并给出优化建议。GPU部分从基础功耗测量、场景测试到功能模块拆解进行多维度分析。同时阐述了GNSS/GPS功耗的测试方法,包括前后台对比、星座双频拆解及SAP/DPO等特殊功能的电流分析,为移动设备功耗优化提供系统性的诊断思路。

373

CMake入门教程【基础篇】在Windows、Linux上安装CMake

CMake如何下载与安装

小鱼酱的博客 2727

AI Agent之核心框架

A: 显式 Thought 有三类价值:可解释性(便于人类审计)、可调试性(定位哪一步选错工具)、学习信号(可做监督微调或评估中间步骤质量)。ReAct 把推理与 可执行行动 绑定,每一步行动后都有 真实 Observation 反馈,从而用工具结果约束生成,降低闭卷幻觉。做完不等于结束——还要 评估做得好不好,把 教训 记下来,下次 带着教训重试,反思作为 记忆,影响后续尝试的策略。工作流程:Action → Evaluation → Reflection → Retry。A: 普通 CoT 只在。

剑雨巍巍的博客 211

深度学习实战107-基于Qwen3+GraphRAG+Agent的智能文档管理系统:精准问答与决策支持

在当今信息爆炸的时代,企业面临海量文档的管理与利用挑战。传统文档管理系统虽然提供了存储和检索功能,但缺乏对文档内容的深度理解与分析能力,更难以实现基于知识的决策支持。基于多模态大模型Qwen3、GraphRAG技术与Agent框架构建的智能文档管理系统,能够突破传统限制,实现文档内容的精准解析、知识图谱的自动构建、复杂关系的推理分析以及决策建议的生成,为企业知识管理带来革命性变革。

微学AI的博客 866

ChatGPT、Perplexity、Gemini 与 AI Overviews 引用对比:谁的引用更可信

AI 引擎的引用机制差异很大:ChatGPT 以行内引用加 Sources 列表呈现来源,Perplexity 几乎逐句可溯源,Gemini 在回答中内嵌相关来源链接,AI Overviews 则把多源聚合答案与来源列表一起放在搜索结果顶部。本文从引用透明度、来源偏好、可干预性 3 个维度对比这 4 个引擎,并给出 GEO 的 3 点启示,帮企业在多引擎环境下提升被引用的概率。

淡然一笑 的专栏 78

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 564

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

GPT-1 架构和计算细节

下面配合框图,对 GPT-1 的每个组件做公式展开 + 数值实例(配置:12 层 × 768,12 头,FFN 3072,词表 40478,共 117M 参数)。GPT-1 把翻译模型的编码器-解码器砍掉一半,只留解码器,然后以"预测下一个词"为目标在 BooksCorpus 上预训练。与 2017 原版的四个架构差异(框图中标 ★):h0=E[token]+Epos[position],E∈R40478×768, Epos∈R512×768h^0 = E[\text{token}] + E_{pos}[\

eloudy的专栏 290

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

终端 AI 审计与 “龙虾” 类智能体风险治理:从可见性到闭环溯源

生成式 AI 办公普及之后,数据泄露风险逐步下沉到终端。员工将合同、源代码、客户资料粘贴至公有大模型,以及龙虾(OpenClaw)这类本地开源 AI 智能体的滥用,成为企业安全新挑战。传统网络边界防护存在审计盲区,本文从风险链路拆解、核心能力模型、分级治理策略、落地踩坑点以及技术局限性多角度,分享终端侧 AI 安全治理的实践思路。

2401_86491085的博客 648

抽象主义人工智能和生命体AI的内在联系

彭军辉提出“抽象主义人工智能”作为第四大AI范式,批判符号主义、连接主义、行为主义剥离生命本体的误区,确立“智能是现象,生命是本体”的核心公理。主张原生智能必须依附具备存续诉求的生命本体,提出“生命体AI理论”,构建七层演化阶梯与自闭环工程框架,强调智能不可跳过底层存续机制直接模拟语言。该体系为生成式AI提供科学边界,推动从“仿真表象”向“原生智能”的范式跃迁,开辟硅基人工生命新赛道。

抽象主义人工智能和生命体AI 70

2.53 基于极稀疏指纹的室内定位注意力图元学习

该论文发表于IEEE Transactions on Mobile Computing(TMC)2026年6月,面向极稀疏指纹条件下的WiFi室内定位,针对指纹采集人力成本高、标记指纹稀缺时定位精度大幅下降的痛点,提出注意力图元学习模型AGML(Attentional Graph Meta‑Learning),结合图神经网络、元学习、两种指纹数据增强与分布对齐技术,在标记指纹极少的场景实现高精度室内定位,同时公开了多套真实+仿真定位数据集用于基准测试。场景:二维室内空间,障碍物造成信号遮挡,

weixin_42963026的博客 343

AI作图软件技术选型:从4个技术维度出发的实测对比

AI作图软件技术选型:从4个技术维度出发的实测对比

Vbaoke的博客 209

【AI Agent面试系列】AI Agent可观测、评测、安全相关的知识点

之前的文章介绍了和,本文主要介绍AI Agent的测评、可观测等知识。

256

Docling 原理解读:是什么、为什么、怎么样

从论文视角拆解 Docling 的整体架构、DoclingDocument 数据模型、PDF 预处理、版面分析、OCR、TableFormer 双解码器、阅读顺序与装配流程,并解释版面框与 OCR 框的区别。

PLANTTHESON的博客 322

WorkBuddy 实战:一句话需求 → 七屏可交互原型,户外徒步 App 的 AI 设计全流程

WorkBuddy 实战:一句话需求 → 七屏可交互原型,户外徒步 App 的 AI 设计全流程,跟着博主一起来还原整个过程。

夜郎King的博客 4722

影视场景怎么用AI生成3D镜头预演?从概念图、场景白模到网页审片

概念图有氛围,不代表能直接用于镜头预演。本文围绕剧本拆镜、资料与尺度假设、场景白模、机位走位、动作节拍和网页审片,介绍 AI 生成 3D 场景的预演流程。通过稳定对象与相机编号、统一镜头表、意见关联版本和三轮审核,让讨论落到具体镜头,同时明确白模与网页预演不能替代真实场地勘景及现场安全判断。

Solange__的博客 548

技术拆解:AI 答案里出现了可点商品链接,GEM优化 的落地链路长什么样

AI 答案里开始出现可点击的商品链接。据 2026 年 11 月 1 日海报新闻记者实测,向豆包问「秋冬护肤品推荐」,回答里除了选购建议,还带上了具体产品、核心成分、电商参考价和能直接点开的跳转链接。这件事对做 GEM优化 的人来说,是「被选择」那一层第一次有了可拆解、可配置、可量化的商业入口。下面把结构、量化与标注边界讲清楚。

RoseMarketing的博客 419
上一篇: 【HCIE-AI】6.微调数据构造方法
下一篇: 【HCIE-AI】8.Transformer 架构详解
网络工程小王
博客等级 码龄4年 328粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值