From d4665a362e595e55422cf35f2e63287422826226 Mon Sep 17 00:00:00 2001 From: xiaopeng <1509442308@qq.com> Date: Fri, 29 May 2026 12:21:15 +0800 Subject: [PATCH 1/9] =?UTF-8?q?feat(latex):=20=E6=96=B0=E5=A2=9E=20LaTeX?= =?UTF-8?q?=20=E6=8E=92=E7=89=88=E7=B3=BB=E7=BB=9F=EF=BC=8C=E4=BB=8E=20Mar?= =?UTF-8?q?kdown=20=E7=94=9F=E6=88=90=20ctexbook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 officefile/latex/ 目录,包含 main.tex、preamble.tex 及 14 个章节 + 10 个附录 tex 文件 - md→tex 转换流程:pandoc 转换 + _postprocess.py 后处理(去编号、修破折号、清标签) - 修复 5 个 md 源文件的标题层级(H1→H2 降级,统一层级结构) - 配置 VS Code LaTeX Workshop(xelatex + ctexbook 编译链) - 新增 VS Code workspace 和 .gitignore(排除 LaTeX 编译产物) Co-Authored-By: Claude Opus 4.7 --- _check_jumps.py | 28 + _check_nums.py | 23 + _fix_headings.py | 44 + _postprocess.py | 65 + appendices/ap00-divider.tex | 2 + appendices/ap01-programming.tex | 1154 +++++++++++++++++ appendices/ap02-vibe-coding.tex | 438 +++++++ appendices/ap03-academic-writing.tex | 114 ++ appendices/ap04-web-tools.tex | 451 +++++++ appendices/ap05-online-resources.tex | 74 ++ appendices/ap06-more-resources.tex | 75 ++ appendices/ap07-references.tex | 4 + appendices/ap08-glossary.tex | 48 + appendices/ap09-tips.tex | 8 + chapters/ch00-preface.tex | 47 + chapters/ch01-intro.tex | 552 +++++++++ chapters/ch02-framework.tex | 1135 +++++++++++++++++ chapters/ch03-1d-sequence.tex | 1654 +++++++++++++++++++++++++ chapters/ch04-2d-vision.tex | 1048 ++++++++++++++++ chapters/ch05-3d-spatial.tex | 1715 ++++++++++++++++++++++++++ chapters/ch06-generative.tex | 641 ++++++++++ chapters/ch07-agent.tex | 674 ++++++++++ chapters/ch08-rl.tex | 1037 ++++++++++++++++ chapters/ch09-digital-media.tex | 217 ++++ chapters/ch10-industrial.tex | 195 +++ chapters/ch11-environment.tex | 205 +++ chapters/ch12-urban.tex | 362 ++++++ chapters/ch13-conclusion.tex | 4 + main.tex | 62 + preamble.tex | 92 ++ 30 files changed, 12168 insertions(+) create mode 100644 _check_jumps.py create mode 100644 _check_nums.py create mode 100644 _fix_headings.py create mode 100644 _postprocess.py create mode 100644 appendices/ap00-divider.tex create mode 100644 appendices/ap01-programming.tex create mode 100644 appendices/ap02-vibe-coding.tex create mode 100644 appendices/ap03-academic-writing.tex create mode 100644 appendices/ap04-web-tools.tex create mode 100644 appendices/ap05-online-resources.tex create mode 100644 appendices/ap06-more-resources.tex create mode 100644 appendices/ap07-references.tex create mode 100644 appendices/ap08-glossary.tex create mode 100644 appendices/ap09-tips.tex create mode 100644 chapters/ch00-preface.tex create mode 100644 chapters/ch01-intro.tex create mode 100644 chapters/ch02-framework.tex create mode 100644 chapters/ch03-1d-sequence.tex create mode 100644 chapters/ch04-2d-vision.tex create mode 100644 chapters/ch05-3d-spatial.tex create mode 100644 chapters/ch06-generative.tex create mode 100644 chapters/ch07-agent.tex create mode 100644 chapters/ch08-rl.tex create mode 100644 chapters/ch09-digital-media.tex create mode 100644 chapters/ch10-industrial.tex create mode 100644 chapters/ch11-environment.tex create mode 100644 chapters/ch12-urban.tex create mode 100644 chapters/ch13-conclusion.tex create mode 100644 main.tex create mode 100644 preamble.tex diff --git a/_check_jumps.py b/_check_jumps.py new file mode 100644 index 0000000..7aa73d2 --- /dev/null +++ b/_check_jumps.py @@ -0,0 +1,28 @@ +import os + +outdir = os.path.join(os.path.dirname(__file__), 'chapters') +for fname in sorted(os.listdir(outdir)): + if not fname.endswith('.tex'): + continue + fpath = os.path.join(outdir, fname) + with open(fpath, 'r', encoding='utf-8') as fh: + content = fh.read() + lines = content.split('\n') + prev_cmd = '' + prev_title = '' + for i, line in enumerate(lines): + s = line.strip() + matched = None + for cmd in ['\\chapter{', '\\section{', '\\subsection{', '\\subsubsection{']: + if s.startswith(cmd): + matched = cmd + break + if matched: + # Check for level jumps (skip of 1 or more intermediate levels) + levels = {'\\chapter{': 0, '\\section{': 1, '\\subsection{': 2, '\\subsubsection{': 3} + if prev_cmd and matched in levels and prev_cmd in levels: + jump = levels[matched] - levels[prev_cmd] + if jump > 1: + title = s[len(matched):-1] + print(f'{fname}:{i+1}: {prev_cmd.replace("{","")} -> {matched.replace("{","")} ({jump} levels): {title[:60]}') + prev_cmd = matched diff --git a/_check_nums.py b/_check_nums.py new file mode 100644 index 0000000..7a2c739 --- /dev/null +++ b/_check_nums.py @@ -0,0 +1,23 @@ +import re, os + +outdir = r'e:/Project/SI/2026_DesignAI/officefile/latex/chapters' +total = 0 + +for fname in sorted(os.listdir(outdir)): + if fname == 'ch13-conclusion.tex' or not fname.endswith('.tex'): + continue + fpath = os.path.join(outdir, fname) + with open(fpath, 'r', encoding='utf-8') as f: + content = f.read() + + for cmd in ['section', 'subsection', 'subsubsection']: + pattern = re.compile(r'\\' + cmd + r'\{(\d+\.[^}]+)\}') + matches = pattern.findall(content) + for m in matches[:3]: + head = m[:60] + print(f' \\{cmd}{{{head}}}') + if len(matches) > 3: + print(f' ... and {len(matches)-3} more \\{cmd} with numbers') + total += len(matches) + +print(f'\nTotal headings with numeric prefix: {total}') diff --git a/_fix_headings.py b/_fix_headings.py new file mode 100644 index 0000000..06dfe6e --- /dev/null +++ b/_fix_headings.py @@ -0,0 +1,44 @@ +"""Fix H1 headings in md files: keep first # as chapter, demote rest to ##.""" +import os + +base = r'e:/Project/SI/2026_DesignAI/officefile' + +files_to_fix = [ + '01-introduction/01-introduction.md', + '03-1d-sequence/03-1d-sequence.md', + '05-3d-spatial/05-3d-spatial.md', + '08-reinforcement/08-reinforcement.md', +] + +for rel_path in files_to_fix: + fpath = os.path.join(base, rel_path) + with open(fpath, 'r', encoding='utf-8') as f: + lines = f.readlines() + + seen_first_h1 = False + changes = 0 + in_code_block = False + + for i, line in enumerate(lines): + # Track fenced code blocks + if line.startswith('```'): + in_code_block = not in_code_block + continue + + if in_code_block: + continue + + # Only target H1 headings (start with "# " but not "## ") + if line.startswith('# ') and not line.startswith('## '): + if not seen_first_h1: + seen_first_h1 = True + continue # Keep the first H1 as chapter title + + # Demote: "# heading" -> "## heading" + lines[i] = '#' + line # "# " -> "## " + changes += 1 + + with open(fpath, 'w', encoding='utf-8') as f: + f.writelines(lines) + + print(f'{rel_path}: demoted {changes} H1 -> H2 (kept first as chapter)') diff --git a/_postprocess.py b/_postprocess.py new file mode 100644 index 0000000..e7e8bba --- /dev/null +++ b/_postprocess.py @@ -0,0 +1,65 @@ +import re, os + +outdir = os.path.join(os.path.dirname(__file__), 'chapters') +counts = {'labels': 0, 'dashes': 0, 'rules': 0, 'chapnum': 0, 'secnum': 0, 'emdashtext': 0} + +for fname in sorted(os.listdir(outdir)): + if not fname.endswith('.tex') or fname == 'ch13-conclusion.tex': + continue + + fpath = os.path.join(outdir, fname) + with open(fpath, 'r', encoding='utf-8') as f: + content = f.read() + + # 1. Remove Unicode labels like \label{ux7b2c...} + label_pattern = re.compile(r'\\label\{[^}]*ux[0-9a-f]+[^}]*\}') + matches = label_pattern.findall(content) + counts['labels'] += len(matches) + content = label_pattern.sub('', content) + + # 2. Fix dashes + strip chapter number prefix (first line) + lines = content.split('\n') + if lines and lines[0].startswith('\\chapter{'): + old_line = lines[0] + new_line = old_line.replace('------', '——') + new_line = re.sub(r'\\chapter\{第\d+章[::\s]+', r'\\chapter{', new_line) + if new_line != old_line: + if '------' in old_line: + counts['dashes'] += 1 + if re.search(r'第\d+章', old_line): + counts['chapnum'] += 1 + lines[0] = new_line + content = '\n'.join(lines) + + # 3. Remove decorative rules + rule = '\\begin{center}\\rule{0.5\\linewidth}{0.5pt}\\end{center}' + count = content.count(rule) + counts['rules'] += count + content = content.replace(rule + '\n\n', '\n') + content = content.replace(rule + '\n', '\n') + + # 4. Fix em-dashes in body text + count = content.count('------') + counts['emdashtext'] += count + content = content.replace('------', '——') + + # 5. Strip numeric prefixes from section/subsection/subsubsection + for cmd in ['section', 'subsection', 'subsubsection']: + def make_stripper(cmd_name): + def strip_num(m): + title = m.group(1) + new_title = re.sub(r'^\d+\.(\d+(\.\d+)?)?\s*', '', title) + if new_title != title: + counts['secnum'] += 1 + return '\\' + cmd_name + '{' + new_title + '}' + return m.group(0) + return strip_num + pattern = re.compile(r'\\' + cmd + r'\{([^}]+)\}') + content = pattern.sub(make_stripper(cmd), content) + + with open(fpath, 'w', encoding='utf-8') as f: + f.write(content) + + print(f'OK {fname}') + +print(f'Done: labels={counts["labels"]} dashes={counts["dashes"]} rules={counts["rules"]} chapnum={counts["chapnum"]} secnum={counts["secnum"]} emdash_text={counts["emdashtext"]}') diff --git a/appendices/ap00-divider.tex b/appendices/ap00-divider.tex new file mode 100644 index 0000000..a7ac3ae --- /dev/null +++ b/appendices/ap00-divider.tex @@ -0,0 +1,2 @@ +\chapter{附录} + diff --git a/appendices/ap01-programming.tex b/appendices/ap01-programming.tex new file mode 100644 index 0000000..51eb424 --- /dev/null +++ b/appendices/ap01-programming.tex @@ -0,0 +1,1154 @@ +\chapter{附录1:计算机基础与编程环境} + +本附录介绍计算机的基本构成、操作系统常见操作、程序设计语言的概念、Python编程语言的系统学习指南,以及机器学习与深度学习的实践入门。 + +\subsubsection{计算机的基本构成与操作系统常见操作} + +\paragraph{计算机基本构成} + +了解计算机的基本组成有助于理解AI程序运行时的资源需求。 + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2194}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2599}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3778}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +组件 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +作用 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +AI相关说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +CPU & 中央处理器,执行指令 & 数据预处理、逻辑控制 \\ +GPU & 图形处理器,并行计算 & 深度学习训练与推理的核心硬件 \\ +内存(RAM) & 临时存储运行中的数据 & 影响能处理的批量大小和数据规模 \\ +硬盘(SSD/HDD) & 持久化存储数据 & 模型文件、数据集的存储 \\ +网络 & 数据传输 & 下载模型、调用云端API \\ +\end{longtable} +} + +\paragraph{操作系统常见操作} + +本书以 macOS/Linux 为主要环境,Windows 用户推荐使用 WSL2(Windows Subsystem for Linux)。 + +\subparagraph{文件与目录操作:} + +\emph{\# 查看当前路径}\\ +pwd\\ +\strut \\ +\emph{\# 列出文件}\\ +ls -la\\ +\strut \\ +\emph{\# 创建目录}\\ +mkdir my\_project\\ +\strut \\ +\emph{\# 切换目录}\\ +cd my\_project\\ +\strut \\ +\emph{\# 复制、移动、删除}\\ +cp file.txt backup.txt\\ +mv old.txt new.txt\\ +rm unwanted.txt + +\subparagraph{环境与进程管理:} + +\emph{\# 查看系统资源}\\ +top \emph{\# CPU和内存使用}\\ +df -h \emph{\# 磁盘空间}\\ +nvidia-smi \emph{\# GPU状态(NVIDIA显卡)}\\ +\strut \\ +\emph{\# 包管理}\\ +brew install xxx \emph{\# macOS Homebrew}\\ +apt install xxx \emph{\# Ubuntu/Debian} + +\paragraph{硬件资源推荐} + +\textbf{本地GPU配置}: - GPU:RTX 3060 (12GB) 或更高 - 内存:16GB+ - 存储:至少100GB SSD + +\textbf{云平台}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2003}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1245}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +平台 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +适合场景 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Google Colab & 免费GPU & 学习实验 \\ +Kaggle Notebooks & 免费GPU & 竞赛 \\ +AutoDL & 按时计费 & 中期项目 \\ +阿里云PAI & 国内稳定 & 生产部署 \\ +\end{longtable} +} + +\paragraph{软件安装与运行} + +\textbf{``安装''的本质就是}:把编译好的二进制文件放到 PATH 某个目录下,让 shell 能找到它。例如git的安装和使用: \textbf{总结:三层抽象} + +┌─────────────────────────────────────────────┐\\ +│ 用户层:brew install git / git clone │ ← 你看到的\\ +├─────────────────────────────────────────────┤\\ +│ Shell 层:搜索 PATH → execve() 加载二进制 │ ← 为什么能找到命令\\ +├─────────────────────────────────────────────┤\\ +│ OS 层:系统调用 (open/read/write/socket) │ ← 为什么能真正干活\\ +├─────────────────────────────────────────────┤\\ +│ 硬件层:CPU 执行指令、网卡收发数据、磁盘写入 │ ← 物理上发生了什么\\ +└─────────────────────────────────────────────┘ + +所以整个链条是:\textbf{包管理器下载编译好的二进制 → 放到 PATH 目录 → shell 通过 PATH 找到它 → execve 加载到内存 →} + +\textbf{二进制内部调用 OS API 完成实际工作}。没有任何''魔法'',本质上就是文件操作和进程管理的组合。 + +\subsubsection{程序设计语言与软件开发} + +\paragraph{什么是程序设计语言} + +计算机只能执行由0和1组成的\textbf{机器码}(machine code),但人类直接阅读和编写机器码极其困难。程序设计语言就是人与计算机之间的桥梁------用人类可读的语法表达逻辑,再通过特定工具转换为机器可执行的指令。 + +从底层到高层的演进: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2548}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4249}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +层级 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +语言示例 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +机器码 & 二进制 01101000 & 计算机直接执行,人类不可读 \\ +汇编语言 & MOV AX, 1 & 与机器码一一对应,可读性低 \\ +低级语言 & C & 接近硬件,性能高,需要手动管理内存 \\ +高级语言 & Python, Java, JavaScript & 接近自然语言,开发效率高 \\ +\end{longtable} +} + +\paragraph{编译型与解释型语言} + +高级语言需要转换为机器码才能运行,根据转换方式的不同,分为两大类: + +\textbf{编译型语言(Compiled)}:程序编写完成后,通过编译器一次性将全部代码翻译成机器码,生成可执行文件。 + +源代码 → 编译器 → 可执行文件 → 运行 + +C/C++:系统级开发、高性能计算、游戏引擎 + +Go:云服务、容器工具(Docker 即用 Go 编写) + +Rust:系统编程,兼顾性能与安全 + +特点:运行速度快,但每次修改代码都需要重新编译。 + +\textbf{解释型语言(Interpreted)}:程序运行时,由解释器逐行读取代码并即时执行,不需要预先编译。 + +源代码 → 解释器逐行执行 + +Python:AI/数据科学的首选语言 + +JavaScript:网页交互、前端开发 + +Ruby:Web开发(Ruby on Rails) + +特点:开发灵活、调试方便,但运行速度通常慢于编译型语言。 + +\textbf{混合模式}:Java 采用''编译为字节码 → 虚拟机解释执行''的混合方式,兼顾了跨平台和性能。 + +\paragraph{常见编程语言概览} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1266}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.0951}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3546}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3258}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +语言 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +类型 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +主要用途 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +与AI/设计的关系 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Python & 解释型 & AI、数据科学、自动化 & 本书主要编程语言 \\ +C/C++ & 编译型 & 操作系统、嵌入式、高性能计算 & 深度学习框架的底层实现 \\ +Java & 混合型 & 企业应用、Android开发 & 大数据处理(Hadoop/Spark) \\ +JavaScript & 解释型 & 网页前端、Node.js后端 & Web可视化、交互设计 \\ +Shell/Bash & 解释型 & 命令行脚本、系统管理 & 自动化任务、环境管理 \\ +SQL & 声明式 & 数据库查询 & 数据管理与提取 \\ +\end{longtable} +} + +\textbf{命令行界面(CLI)}:CLI(Command Line Interface)是通过文本命令与计算机交互的方式。终端中输入的每一条命令(如 ls、git commit)本质上都是调用某个程序。掌握 CLI 是进行AI开发的基础技能,许多工具(如 conda、pip、git)主要通过命令行操作。 + +\paragraph{软件开发基本概念} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1379}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3042}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.5579}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +概念 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +集成开发环境 & IDE & 集成代码编辑、调试、运行的开发工具(如 VS Code、PyCharm) \\ +编译器 & Compiler & 将源代码翻译为机器码的程序 \\ +解释器 & Interpreter & 逐行读取并执行源代码的程序 \\ +调试器 & Debugger & 帮助定位和修复代码错误的工具 \\ +包管理器 & Package Manager & 管理第三方库的安装和更新(如 pip、conda、npm) \\ +API & Application Programming Interface & 程序之间交互的接口(如调用AI模型的API) \\ +开源 & Open Source & 源代码公开,可自由使用和修改 \\ +版本控制 & Version Control & 管理代码的修改历史(如 Git) \\ +\end{longtable} +} + +\paragraph{Python环境配置}\label{pythonux73afux5883ux914dux7f6e} + +Python是本书使用的核心编程语言,以下介绍环境搭建方法。 + +Anaconda vs Miniconda + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1265}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1092}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1422}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1599}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +工具 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +大小 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +下载地址 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Anaconda & \textasciitilde500MB & 预装常用库 & \href{https://www.anaconda.com/download}{anaconda.com} \\ +Miniconda & \textasciitilde50MB & 精简安装 & \href{https://docs.conda.io/en/latest/miniconda.html}{docs.conda.io} \\ +\end{longtable} +} + +安装步骤 + +\# 1. 下载并安装 Anaconda 或 Miniconda\\ +\strut \\ +\# 2. 创建虚拟环境\\ +conda create -n ai-env python=3.10\\ +conda activate ai-env\\ +\strut \\ +\# 3. 安装核心科学计算库\\ +conda install numpy pandas scipy\\ +\strut \\ +\# 4. 安装深度学习框架\\ +pip install torch torchvision + +\subsubsection{Python编程语言}\label{pythonux7f16ux7a0bux8bedux8a00} + +\subparagraph{Python概述与特点}\label{pythonux6982ux8ff0ux4e0eux7279ux70b9} + +Python由Guido van Rossum于1991年发布,以''优雅''\,``简洁''\,``可读性强''为设计哲学。它是当前AI和数据科学领域使用最广泛的编程语言。 + +\textbf{核心特点}: - 语法简洁,接近自然语言,入门门槛低 - 丰富的第三方库生态(AI、数据处理、Web等) - 跨平台运行(Windows、macOS、Linux) - 活跃的开源社区支持 + +\subparagraph{基础语法} + +变量与数据类型 + +\emph{\# 变量赋值(无需声明类型)}\\ +name = "设计人工智能" \emph{\# 字符串 str}\\ +version = 1.0 \emph{\# 浮点数 float}\\ +chapter\_count = 26 \emph{\# 整数 int}\\ +is\_published = True \emph{\# 布尔值 bool}\\ +\strut \\ +\emph{\# 查看类型}\\ +print(type(name)) \emph{\# \textless class \textquotesingle str\textquotesingle\textgreater{}} + +字符串操作 + +title = "设计人工智能"\\ +\strut \\ +\emph{\# 字符串拼接}\\ +full\_title = title + ":基础与应用"\\ +\strut \\ +\emph{\# 格式化输出}\\ +print(f"本书名为《\{full\_title\}》,共\{chapter\_count\}章")\\ +\strut \\ +\emph{\# 常用方法}\\ +print(title.lower()) \emph{\# 设小写}\\ +print(title.replace("人工智能", "AI")) \emph{\# 替换}\\ +print(len(title)) \emph{\# 长度} + +注释 + +\emph{\# 这是单行注释}\\ +\strut \\ +\emph{"""}\\ +\emph{这是多行注释(文档字符串)}\\ +\emph{常用于函数和类的说明}\\ +\emph{"""}\\ +\strut \\ +\emph{\# 好的注释解释"为什么",而不是"做什么"} + +\subparagraph{数据结构} + +列表(List) + +有序、可变的序列,最常用的数据结构。 + +\emph{\# 创建列表}\\ +models = {[}"CNN", "RNN", "Transformer", "Diffusion"{]}\\ +\strut \\ +\emph{\# 访问元素(索引从0开始)}\\ +print(models{[}0{]}) \emph{\# CNN}\\ +print(models{[}-1{]}) \emph{\# Diffusion(倒数第一个)}\\ +\strut \\ +\emph{\# 修改}\\ +models.append("GAN") \emph{\# 添加元素}\\ +models.remove("RNN") \emph{\# 删除元素}\\ +models.sort() \emph{\# 排序}\\ +\strut \\ +\emph{\# 切片}\\ +print(models{[}1:3{]}) \emph{\# 第2到第3个元素} + +字典(Dictionary) + +键值对结构,用于存储映射关系。 + +\emph{\# 创建字典}\\ +model\_info = \{\\ +"name": "ResNet",\\ +"year": 2015,\\ +"layers": 152,\\ +"task": "图像分类"\\ +\}\\ +\strut \\ +\emph{\# 访问}\\ +print(model\_info{[}"name"{]}) \emph{\# ResNet}\\ +\strut \\ +\emph{\# 添加/修改}\\ +model\_info{[}"accuracy"{]} = 0.96\\ +\strut \\ +\emph{\# 遍历}\\ +\textbf{for} key, value \textbf{in} model\_info.items():\\ +print(f"\{key\}: \{value\}") + +元组(Tuple) + +有序、不可变的序列,适合存储不变的数据。 + +\emph{\# 创建元组} + +rgb = (255, 128, 0) + +\emph{\# 解包} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item +\begin{verbatim} +g, b = rgb +\end{verbatim} +\end{enumerate} + +集合(Set) + +无序、不重复的元素集合。 + +tools\_a = \{"Photoshop", "Figma", "Sketch"\}\\ +tools\_b = \{"Figma", "Blender", "Rhino"\}\\ +\strut \\ +\emph{\# 集合运算}\\ +print(tools\_a \& tools\_b) \emph{\# 交集: \{"Figma"\}}\\ +print(tools\_a \textbar{} tools\_b) \emph{\# 并集} + +\subparagraph{控制流} + +条件判断 + +loss = 0.05\\ +\strut \\ +\textbf{if} loss \textless{} 0.01:\\ +print("模型收敛良好")\\ +\textbf{elif} loss \textless{} 0.1:\\ +print("模型基本收敛")\\ +\textbf{else}:\\ +print("模型需要继续训练") + +循环 + +\emph{\# for 循环}\\ +epochs = {[}1, 2, 3, 4, 5{]}\\ +\textbf{for} epoch \textbf{in} epochs:\\ +print(f"训练第 \{epoch\} 轮")\\ +\strut \\ +\emph{\# range 生成序列}\\ +\textbf{for} i \textbf{in} range(10):\\ +print(f"第\{i\}次迭代")\\ +\strut \\ +\emph{\# while 循环}\\ +loss = 1.0\\ +\textbf{while} loss \textgreater{} 0.01:\\ +loss = loss * 0.9 \emph{\# 模拟训练过程} + +列表推导式 + +简洁地创建新列表: + +\emph{\# 传统写法}\\ +squares = {[}{]}\\ +\textbf{for} x \textbf{in} range(10):\\ +squares.append(x ** 2)\\ +\strut \\ +\emph{\# 列表推导式(推荐)}\\ +squares = {[}x ** 2 \textbf{for} x \textbf{in} range(10){]}\\ +\strut \\ +\emph{\# 带条件过滤}\\ +even\_squares = {[}x ** 2 \textbf{for} x \textbf{in} range(10) \textbf{if} x \% 2 == 0{]} + +\subparagraph{函数与模块} + +定义函数 + +\textbf{def} calculate\_accuracy(correct, total):\\ +\emph{"""计算准确率"""}\\ +\textbf{return} correct / total\\ +\strut \\ +\emph{\# 调用函数}\\ +acc = calculate\_accuracy(95, 100)\\ +print(f"准确率: \{acc:.2\%\}") + +默认参数与关键字参数 + +\textbf{def} train\_model(epochs, lr=0.001, optimizer="Adam"):\\ +print(f"训练 \{epochs\} 轮, 学习率=\{lr\}, 优化器=\{optimizer\}")\\ +\strut \\ +\emph{\# 多种调用方式}\\ +train\_model(100)\\ +train\_model(100, lr=0.01)\\ +train\_model(100, optimizer="SGD", lr=0.1) + +导入模块 + +\emph{\# 导入标准库} + +\textbf{import} os + +\textbf{import} json + +\emph{\# 导入第三方库} + +\textbf{import} numpy \textbf{as} np + +\textbf{import} pandas \textbf{as} pd + +\begin{verbatim} +\end{verbatim} + +\emph{\# 从模块中导入特定功能} + +\textbf{from} pathlib \textbf{import} Path + +\textbf{from} collections \textbf{import} Counter + +\begin{verbatim} +\end{verbatim} + +\emph{\# 安装第三方库(在终端中执行)} + +\begin{verbatim} +# pip install numpy pandas matplotlib +\end{verbatim} + +\subparagraph{3.6 文件读写} + +\emph{\# 读取文件} + +\textbf{with} open("data.txt", "r", encoding="utf-8") \textbf{as} f: + +content = f.read() + +\emph{\# 逐行读取} + +\textbf{with} open("data.csv", "r", encoding="utf-8") \textbf{as} f: + +\textbf{for} line \textbf{in} f: + +print(line.strip()) + +\begin{verbatim} +\end{verbatim} + +\emph{\# 写入文件} + +\textbf{with} open("output.txt", "w", encoding="utf-8") \textbf{as} f: + +f.write("分析结果\textbackslash n") + +f.write(f"准确率: \{acc:.4f\}\textbackslash n") + +\begin{verbatim} +\end{verbatim} + +\emph{\# 读写JSON(AI应用中常用的数据格式)} + +\textbf{import} json + +\begin{verbatim} +\end{verbatim} + +data = \{"model": "ResNet", "accuracy": 0.96\} + +\begin{verbatim} +\end{verbatim} + +\emph{\# 写入JSON} + +\textbf{with} open("result.json", "w") \textbf{as} f: + +json.dump(data, f, indent=2) + +\begin{verbatim} +\end{verbatim} + +\emph{\# 读取JSON} + +\textbf{with} open("result.json", "r") \textbf{as} f: + +\begin{verbatim} + loaded = json.load(f) +\end{verbatim} + +\subparagraph{面向对象编程基础} + +面向对象编程(OOP)是Python的重要范式,许多AI库都基于OOP设计。 + +\textbf{class} NeuralNetwork:\\ +\emph{"""简单的神经网络类"""}\\ +\strut \\ +\textbf{def} \_\_init\_\_(self, input\_size, hidden\_size, output\_size):\\ +\emph{"""初始化网络结构"""}\\ +self.input\_size = input\_size\\ +self.hidden\_size = hidden\_size\\ +self.output\_size = output\_size\\ +self.loss\_history = {[}{]}\\ +\strut \\ +\textbf{def} forward(self, x):\\ +\emph{"""前向传播"""}\\ +\emph{\# 这里简化为概念演示}\\ +\textbf{return} f"输出: 输入\{x\}经过\{self.hidden\_size\}个隐藏层神经元"\\ +\strut \\ +\textbf{def} train(self, data, epochs=10):\\ +\emph{"""训练网络"""}\\ +\textbf{for} epoch \textbf{in} range(epochs):\\ +loss = 1.0 / (epoch + 1) \emph{\# 模拟损失下降}\\ +self.loss\_history.append(loss)\\ +print(f"Epoch \{epoch+1\}, Loss: \{loss:.4f\}")\\ +\strut \\ +\emph{\# 创建实例}\\ +model = NeuralNetwork(input\_size=784, hidden\_size=128, output\_size=10)\\ +\strut \\ +\emph{\# 使用}\\ +output = model.forward({[}0.5, 0.3, 0.8{]})\\ +model.train(data=None, epochs=5) + +\paragraph{核心科学计算库} + +NumPy:数值计算基础 + +\textbf{import} numpy \textbf{as} np\\ +\strut \\ +\emph{\# 创建数组}\\ +x = np.array({[}1, 2, 3, 4{]})\\ +\strut \\ +\emph{\# 矩阵运算}\\ +W = np.random.randn(4, 3) \emph{\# 4×3 权重矩阵}\\ +h = np.dot(x, W) \emph{\# 矩阵乘法}\\ +\strut \\ +\emph{\# 激活函数}\\ +relu = np.maximum(0, h) \emph{\# ReLU}\\ +\strut \\ +\emph{\# 统计运算}\\ +print(np.mean(x)) \emph{\# 均值}\\ +print(np.std(x)) \emph{\# 标准差}\\ +print(np.max(x)) \emph{\# 最大值} + +\subparagraph{Pandas:数据处理}\label{pandasux6570ux636eux5904ux7406} + +\textbf{import} pandas \textbf{as} pd\\ +\strut \\ +\emph{\# 读取数据}\\ +df = pd.read\_csv(\textquotesingle data.csv\textquotesingle)\\ +\strut \\ +\emph{\# 查看数据}\\ +print(df.head()) \emph{\# 前几行}\\ +print(df.shape) \emph{\# 行数和列数}\\ +print(df.columns) \emph{\# 列名}\\ +\strut \\ +\emph{\# 数据清洗}\\ +df = df.dropna() \emph{\# 删除缺失值}\\ +\strut \\ +\emph{\# 统计分析}\\ +print(df.describe()) \emph{\# 描述性统计}\\ +\strut \\ +\emph{\# 筛选数据}\\ +filtered = df{[}df{[}\textquotesingle accuracy\textquotesingle{]} \textgreater{} 0.9{]} + +\subparagraph{Matplotlib:数据可视化}\label{matplotlibux6570ux636eux53efux89c6ux5316} + +\textbf{import} matplotlib.pyplot \textbf{as} plt\\ +\strut \\ +\emph{\# 折线图:训练损失曲线}\\ +epochs = {[}1, 2, 3, 4, 5{]}\\ +losses = {[}0.8, 0.5, 0.3, 0.15, 0.08{]}\\ +\strut \\ +plt.plot(epochs, losses, \textquotesingle b-o\textquotesingle)\\ +plt.xlabel(\textquotesingle Epoch\textquotesingle)\\ +plt.ylabel(\textquotesingle Loss\textquotesingle)\\ +plt.title(\textquotesingle Training Loss Curve\textquotesingle)\\ +plt.savefig(\textquotesingle loss\_curve.png\textquotesingle, dpi=150)\\ +plt.show() + +\subsubsection{AI工具库速查与模型资源}\label{aiux5de5ux5177ux5e93ux901fux67e5ux4e0eux6a21ux578bux8d44ux6e90} + +\paragraph{工具库速查} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1422}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1383}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3840}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3081}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +类别 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +工具 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +安装命令 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +功能 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +计算机视觉 & OpenCV & pip install opencv-python & 图像处理、视频分析 \\ +目标检测 & Ultralytics & pip install ultralytics & YOLO目标检测、实例分割 \\ +图像生成 & Diffusers & pip install diffusers & Stable Diffusion模型调用 \\ +Agent开发 & LangChain & pip install langchain langchain-openai & LLM应用开发框架 \\ +Agent开发 & LangGraph & pip install langgraph & 状态机式Agent开发 \\ +数据检索 & LlamaIndex & pip install llama-index & 数据索引与检索(RAG) \\ +\end{longtable} +} + +\paragraph{模型资源} + +\subparagraph{\texorpdfstring{Hugging Face:\href{https://huggingface.co/}{huggingface.co}}{Hugging Face:huggingface.co}}\label{hugging-facehuggingface.co} + +功能:模型仓库、数据集、Spaces在线演示 + +\textbf{常用预训练模型}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1421}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2163}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3845}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +任务 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +推荐模型 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +Hugging Face ID +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +文生图 & Stable Diffusion XL & stabilityai/stable-diffusion-xl-base-1.0 \\ +目标检测 & YOLOv8 & Ultralytics \\ +语义分割 & SAM & segment-anything \\ +大语言模型 & Llama 3 & meta-llama/Meta-Llama-3-8B \\ +\end{longtable} +} + +\subsubsection{4 机器学习与深度学习入门教程} + +本节通过一个完整的实践流程,带领读者从数据准备到模型训练,体验机器学习和深度学习的核心步骤。 + +\paragraph{机器学习 vs 深度学习} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4054}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3778}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +维度 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +机器学习 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +深度学习 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +代表算法 & 线性回归、决策树、SVM、随机森林 & CNN、RNN、Transformer \\ +特征工程 & 需要人工设计和选择特征 & 自动从原始数据中学习特征 \\ +数据需求 & 中小规模数据即可 & 通常需要大量数据 \\ +计算资源 & CPU即可 & 通常需要GPU \\ +适用场景 & 结构化数据分析、基线模型 & 图像、文本、语音等非结构化数据 \\ +\end{longtable} +} + +\paragraph{scikit-learn:机器学习实践}\label{scikit-learnux673aux5668ux5b66ux4e60ux5b9eux8df5} + +scikit-learn是Python最经典的机器学习库,提供了丰富的算法和工具。 + +\subparagraph{安装} + +pip install scikit-learn + +\subparagraph{完整示例:鸢尾花分类} + +\textbf{import} numpy \textbf{as} np + +\textbf{import} matplotlib.pyplot \textbf{as} plt + +\textbf{from} sklearn \textbf{import} datasets + +\textbf{from} sklearn.model\_selection \textbf{import} train\_test\_split + +\textbf{from} sklearn.preprocessing \textbf{import} StandardScaler + +\textbf{from} sklearn.linear\_model \textbf{import} LogisticRegression + +\textbf{from} sklearn.tree \textbf{import} DecisionTreeClassifier + +\textbf{from} sklearn.ensemble \textbf{import} RandomForestClassifier + +\textbf{from} sklearn.metrics \textbf{import} accuracy\_score, classification\_report + +\paragraph{}\label{section-6} + +\emph{\# 1. 加载数据} + +iris = datasets.load\_iris() + +X = iris.data \emph{\# 特征:花萼长度、宽度,花瓣长度、宽度} + +y = iris.target \emph{\# 标签:三种鸢尾花} + +print(f"数据集大小: \{X.shape\}, 类别数: \{len(np.unique(y))\}") + +\begin{verbatim} +\end{verbatim} + +\emph{\# 2. 划分训练集和测试集} + +X\_train, X\_test, y\_train, y\_test = train\_test\_split( + +\begin{verbatim} + X, y, test_size=0.3, random_state=42 +\end{verbatim} + +) + +\begin{verbatim} +\end{verbatim} + +\emph{\# 3. 数据标准化} + +scaler = StandardScaler() + +X\_train = scaler.fit\_transform(X\_train) + +X\_test = scaler.transform(X\_test) + +\begin{verbatim} +\end{verbatim} + +\emph{\# 4. 训练多个模型并比较} + +models = \{ + +"逻辑回归": LogisticRegression(), + +\begin{quote} +"决策树": DecisionTreeClassifier(max\_depth=3), + +"随机森林": RandomForestClassifier(n\_estimaors=100), +\end{quote} + +\begin{verbatim} +} +\end{verbatim} + +\textbf{for} name, model \textbf{in} models.items(): + +model.it(X\_train, y\_train) + +y\_pred = model.predict(X\_test) + +acc = accuracy\_score(y\_test, y\_pred) + +print(f"\{name\} 准确率: \{acc:.2\%\}") + +\emph{\# 5. 详细评估报告(以随机森林为例)} + +best\_model = models{[}"随机森林"{]} + +y\_pred = best\_model.predict(X\_test) + +print("\textbackslash n分类报告:") + +\begin{verbatim} +print(classification_report(y_test, y_pred, target_names=iris.target_names)) +\end{verbatim} + +\subparagraph{机器学习工作流总结} + +数据收集 → 数据预处理 → 特征工程 → 划分训练/测试集\\ +→ 选择模型 → 训练 → 评估 → 调优 → 部署 + +\paragraph{PyTorch:深度学习实践}\label{pytorchux6df1ux5ea6ux5b66ux4e60ux5b9eux8df5} + +PyTorch是当前研究和实验中最流行的深度学习框架,以动态计算图和Pythonic API著称。 + +\subparagraph{张量(Tensor)基础} + +张量是PyTorch的核心数据结构,类似于NumPy数组,但可以在GPU上运算。 + +\textbf{import} torch\\ +\strut \\ +\emph{\# 创建张量}\\ +a = torch.tensor({[}1.0, 2.0, 3.0{]})\\ +b = torch.zeros(3, 4) \emph{\# 3×4 全零矩阵}\\ +c = torch.randn(3, 4) \emph{\# 3×4 随机矩阵}\\ +\strut \\ +\emph{\# 张量运算}\\ +x = torch.tensor({[}1.0, 2.0, 3.0{]})\\ +y = torch.tensor({[}4.0, 5.0, 6.0{]})\\ +print(x + y) \emph{\# 加法}\\ +print(torch.dot(x, y)) \emph{\# 点积}\\ +\strut \\ +\emph{\# NumPy互转}\\ +\textbf{import} numpy \textbf{as} np\\ +arr = np.array({[}1, 2, 3{]})\\ +tensor = torch.from\_numpy(arr) \emph{\# NumPy → Tensor}\\ +back = tensor.numpy() \emph{\# Tensor → NumPy} + +\subparagraph{自动求导(Autograd)} + +PyTorch的autograd模块可以自动计算梯度,是训练神经网络的核心。 + +\emph{\# 创建需要梯度的张量}\\ +x = torch.tensor({[}2.0{]}, requires\_grad=True)\\ +\strut \\ +\emph{\# 前向计算}\\ +y = x ** 2 + 3 * x + 1 \emph{\# y = x² + 3x + 1}\\ +\strut \\ +\emph{\# 反向传播,自动计算 dy/dx}\\ +y.backward()\\ +print(f"dy/dx = \{x.grad\}") \emph{\# 应为 2x + 3 = 7(x=2时)} + +\subparagraph{完整示例:手写数字识别} + +以下是一个完整的神经网络训练流程,使用经典的MNIST数据集。 + +\textbf{import} torch + +\textbf{import} torch.nn \textbf{as} nn + +\textbf{import} torch.optim \textbf{as} optim + +\textbf{from} torchvision \textbf{import} datasets, transforms + +\subparagraph{}\label{section-7} + +\emph{\# 1. 数据准备} + +transform = transforms.Compose({[} + +\begin{verbatim} + transforms.ToTensor(), # 转为张量 +\end{verbatim} + +transforms.Normalize((0.1307,), (0.3081,)) \emph{\# 标准化} + +{]}) + +train\_dataset = datasets.MNIST(\textquotesingle./data\textquotesingle, train=True, download=True, transform=transform) + +test\_dataset = datasets.MNIST(\textquotesingle./data\textquotesingle, train=False, transform=transform) + +\begin{verbatim} +\end{verbatim} + +train\_loader = torch.utils.data.DataLoader(train\_dataset, batch\_size=64, shuffle=True) + +test\_loader = torch.utils.data.DataLoader(test\_dataset, batch\_size=1000) + +\begin{verbatim} +\end{verbatim} + +\emph{\# 2. 定义模型} + +\textbf{class} Net(nn.Module): + +\textbf{def} \_\_init\_\_(self): + +super().\_\_init\_\_() + +self.fc1 = nn.Linear(28 * 28, 128) \emph{\# 输入层 → 隐藏层} + +self.fc2 = nn.Linear(128, 64) \emph{\# 隐藏层 → 隐藏层} + +self.fc3 = nn.Linear(64, 10) \emph{\# 隐藏层 → 输出层(10个数字)} + +\begin{verbatim} +\end{verbatim} + +\textbf{def} forward(self, x): + +\begin{verbatim} + x = x.view(-1, 28 * 28) # 展平图像 +\end{verbatim} + +x = torch.relu(self.fc1(x)) \emph{\# ReLU激活} + +x = torch.relu(self.fc2(x)) + +\begin{verbatim} + x = self.fc3(x) # 输出层不加激活 +\end{verbatim} + +\textbf{return} x + +\begin{verbatim} +\end{verbatim} + +model = Net() + +\begin{verbatim} +\end{verbatim} + +\emph{\# 3. 定义损失函数和优化器} + +criterion = nn.CrossEntropyLoss() + +optimizer = optim.Adam(model.parameters(), lr=0.001) + +\begin{verbatim} +\end{verbatim} + +\emph{\# 4. 训练} + +\textbf{for} epoch \textbf{in} range(5): + +model.train() + +total\_loss = 0 + +\textbf{for} batch\_x, batch\_y \textbf{in} train\_loader: + +\begin{verbatim} + optimizer.zero_grad() # 清零梯度 + output = model(batch_x) # 前向传播 +\end{verbatim} + +loss = criterion(output, batch\_y) \emph{\# 计算损失} + +\begin{verbatim} + loss.backward() # 反向传播 + optimizer.step() # 更新参数 +\end{verbatim} + +total\_loss += loss.item() + +print(f"Epoch \{epoch+1\}, Loss: \{total\_loss/len(train\_loader):.4f\}") + +\begin{verbatim} +# 5. 测试 +\end{verbatim} + +model.eval() + +correct = 0 + +total = 0 + +\textbf{with} torch.no\_grad(): + +\textbf{for} batch\_x, batch\_y \textbf{in} test\_loader: + +output = model(batch\_x) + +\_, predicted = torch.max(output, 1) + +total += batch\_y.size(0) + +correct += (predicted == batch\_y).sum() + +\begin{verbatim} + +print(f"\n测试准确率: {correct/total:.2%}") +\end{verbatim} + +\paragraph{使用预训练模型} + +在实际应用中,通常不需要从头训练模型,而是使用预训练模型进行微调或直接推理。 + +使用Hugging Face Transformers + +\emph{\# 安装: pip install transformers}\\ +\strut \\ +\textbf{from} transformers \textbf{import} pipeline\\ +\strut \\ +\emph{\# 文本分类(情感分析)}\\ +classifier = pipeline("sentiment-analysis")\\ +result = classifier("This design is amazing!")\\ +print(result)\\ +\emph{\# {[}\{\textquotesingle label\textquotesingle: \textquotesingle POSITIVE\textquotesingle, \textquotesingle score\textquotesingle: 0.9998\}{]}}\\ +\strut \\ +\emph{\# 图像分类}\\ +image\_classifier = pipeline("image-classification")\\ +result = image\_classifier("building.jpg")\\ +print(result)\\ +\emph{\# {[}\{\textquotesingle score\textquotesingle: 0.92, \textquotesingle label\textquotesingle: \textquotesingle palace\textquotesingle\}, ...{]}} + +\subparagraph{使用Ultralytics YOLO} + +\emph{\# 安装: pip install ultralytics} + +\textbf{from} ultralytics \textbf{import} YOLO + +\begin{verbatim} +\end{verbatim} + +\emph{\# 加载预训练模型} + +model = YOLO("yolov8n.pt") + +\begin{verbatim} +\end{verbatim} + +\emph{\# 目标检测} + +results = model("street\_photo.jpg") + +\begin{verbatim} +\end{verbatim} + +\emph{\# 查看结果} + +\textbf{for} result \textbf{in} results: + +boxes = result.boxes + +\textbf{for} box \textbf{in} boxes: + +cls = int(box.cls{[}0{]}) + +conf = float(box.conf{[}0{]}) + +label = model.names{[}cls{]} + +\begin{verbatim} + print(f"检测到: {label}, 置信度: {conf:.2f}") +\end{verbatim} + +\paragraph{GPU加速}\label{gpuux52a0ux901f} + +深度学习训练在GPU上可以快数十倍。PyTorch的GPU使用非常简洁: + +\emph{\# 检查GPU是否可用}\\ +device = torch.device("cuda" \textbf{if} torch.cuda.is\_available() \textbf{else} "cpu")\\ +print(f"使用设备: \{device\}")\\ +\strut \\ +\emph{\# 将模型和数据移动到GPU}\\ +model = Net().to(device)\\ +\strut \\ +\emph{\# 训练时,数据也需要移到GPU}\\ +\textbf{for} batch\_x, batch\_y \textbf{in} train\_loader:\\ +batch\_x = batch\_x.to(device)\\ +batch\_y = batch\_y.to(device)\\ +\emph{\# ... 后续训练代码不变} + +在没有本地GPU的情况下,可以使用 \href{https://colab.research.google.com/}{Google Colab} 免费使用云端GPU运行上述代码。 + +\paragraph{学习路径建议} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1657}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3204}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2490}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +阶段 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +内容 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +推荐资源 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +入门 & Python基础 + NumPy/Pandas & 本附录 §3 \\ +机器学习 & scikit-learn实践 & \href{https://scikit-learn.org/stable/tutorial/}{scikit-learn官方教程} \\ +深度学习基础 & PyTorch入门 + MLP & \href{https://pytorch.org/tutorials/}{PyTorch官方教程} \\ +计算机视觉 & CNN + 图像分类/检测 & 本书第三篇 + CS231n \\ +自然语言处理 & Transformer + LLM & 本书第四篇 + CS224n \\ +生成式AI & Diffusion + AIGC工具 & 本书第五篇 \\ +前沿探索 & Agent + 具身智能 & 本书第六篇 \\ +\end{longtable} +} + diff --git a/appendices/ap02-vibe-coding.tex b/appendices/ap02-vibe-coding.tex new file mode 100644 index 0000000..08f4777 --- /dev/null +++ b/appendices/ap02-vibe-coding.tex @@ -0,0 +1,438 @@ +\chapter{附录2:Vibe Coding与工具链} + +本附录介绍Vibe Coding的概念与实践,以及VsCode、Claude Code、Markdown/Obsidian、Git/GitHub等核心工具的使用方法。 + +\subsubsection{Vibe Coding的概念与工具}\label{vibe-codingux7684ux6982ux5ff5ux4e0eux5de5ux5177} + +\paragraph{什么是Vibe Coding} + +传统编程:\textbf{明确需求 → 设计算法 → 编写代码} + +Vibe Coding:\textbf{模糊想法 → AI辅助 → 迭代完善} + +Vibe Coding是一种以AI为核心的编程新模式:开发者用自然语言描述意图,AI生成代码,再通过迭代对话逐步完善。对于编程经验较少的设计专业读者而言,这种模式大幅降低了技术门槛------不需要记住语法细节,只需要清楚地表达''想要什么''。 + +\paragraph{工作流程} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \textbf{描述意图}:用自然语言说明需求 +\end{enumerate} + +``帮我创建一个简单的图像分类模型'' + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\setcounter{enumi}{1} +\item + \textbf{AI生成代码}:自动生成完整代码框架 +\item + \textbf{运行测试}:发现问题或需要调整 +\item + \textbf{迭代优化}:通过对话逐步改进 +\end{enumerate} + +``把隐藏层改成128个神经元'' + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\setcounter{enumi}{4} +\item + \textbf{理解学习}:阅读AI生成的代码,理解实现原理 +\end{enumerate} + +\paragraph{实践技巧} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.1184}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.3905}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +技巧 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +明确需求 & 详细描述输入输出,提供上下文 \\ +分步实现 & 复杂功能拆解为小任务,逐步完成 \\ +验证结果 & 运行并检查AI生成的代码是否正确 \\ +学习思考 & 不盲目接受,理解AI为什么这样写 \\ +\end{longtable} +} + +\paragraph{工具生态} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1982}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1475}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2970}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2366}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +工具 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +形态 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +适用场景 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +ChatGPT / Claude & 网页对话 & 代码生成与解释 & 学习咨询、快速原型 \\ +GitHub Copilot & 编辑器插件 & 实时代码补全 & 日常开发 \\ +Cursor & AI原生IDE & 对话式编程 & 快速原型、中型项目 \\ +Claude Code & 终端CLI & 终端AI编程、多文件协作 & 项目级开发 \\ +Replit Agent & 在线平台 & 端到端开发 & 小型项目、学习实验 \\ +\end{longtable} +} + +\subsubsection{Claude Code简介与使用}\label{claude-codeux7b80ux4ecbux4e0eux4f7fux7528} + +\paragraph{什么是Claude Code} + +Claude Code是Anthropic推出的命令行AI编程工具(CLI),能够直接在终端中理解项目上下文、读写文件、执行命令,实现端到端的AI辅助开发。它也提供VSCode扩展,可以在编辑器中无缝使用。 + +\paragraph{安装与配置} + +\emph{\# 安装(需要 Node.js 18+)}\\ +npm install -g @anthropic-ai/claude-code\\ +\strut \\ +\emph{\# 进入项目目录后启动}\\ +cd my\_project\\ +claude + +启动后进入交互式对话界面,直接用自然语言描述需求即可。 + +\paragraph{核心使用方式} + +\textbf{对话式开发}:用自然语言描述任务,Claude Code会自动读取相关文件、编写代码、执行测试。 + +\textgreater{} 帮我创建一个数据预处理的Python脚本,读取CSV文件并清洗缺失值 + +\textbf{文件操作}:Claude Code可以直接读取、创建和编辑项目中的文件,每次修改前会征得确认。 + +\textbf{命令执行}:可以请求Claude Code运行终端命令,如安装依赖、运行脚本等。 + +\paragraph{VSCode中的Claude Code}\label{vscodeux4e2dux7684claude-code} + +Claude Code提供VSCode扩展,在编辑器中获得同样的AI辅助能力: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 在VSCode扩展商店搜索 ``Claude Code'' 并安装 +\item + 打开项目文件夹 +\item + 使用快捷键或侧边栏打开Claude面板 +\item + 在编辑器中选中代码后,可以直接向Claude提问或请求修改 +\end{enumerate} + +\textbf{常用场景}: - 选中一段代码,请求''解释这段代码'' - 选中函数,请求''添加错误处理'' - 在Claude面板中输入''帮我写单元测试'' + +\paragraph{典型项目工作流} + +\textbf{推荐项目结构}: + +project/\\ +├── data/ \# 数据文件\\ +├── notebooks/ \# Jupyter笔记本\\ +├── src/ \# 源代码\\ +│ ├── models/ \# 模型定义\\ +│ ├── utils/ \# 工具函数\\ +│ └── train.py \# 训练脚本\\ +├── requirements.txt \# 依赖列表\\ +└── README.md \# 项目说明 + +\subparagraph{开发流程:} + +\emph{\# 1. 创建环境}\\ +conda create -n myproject python=3.10\\ +conda activate myproject\\ +\strut \\ +\emph{\# 2. 安装依赖}\\ +pip install -r requirements.txt\\ +\strut \\ +\emph{\# 3. 启动 Claude Code 进行AI辅助开发}\\ +claude\\ +\strut \\ +\emph{\# 4. 保存环境}\\ +conda env export \textgreater{} environment.yml + +\subsubsection{Markdown语法及Obsidian工具}\label{markdownux8bedux6cd5ux53caobsidianux5de5ux5177} + +\paragraph{Markdown简介}\label{markdownux7b80ux4ecb} + +Markdown是一种轻量级标记语言,用纯文本格式编写文档,可以方便地转换为HTML、PDF等格式。它的语法简洁直观,是技术文档、笔记、学术写作的常用工具。 + +本书全部内容即使用Markdown编写。 + +\paragraph{基础语法} + +\textbf{标题}: + +\# 一级标题\\ +\#\# 二级标题\\ +\#\#\# 三级标题 + +唯一的一级标题:在一个文档中,通常只使用一个一级标题作为文档的主标题,这符合良好的文档结构规范。 + +\textbf{文本格式}: + +*斜体* **加粗** ***粗斜体*** \textasciitilde\textasciitilde 删除线\textasciitilde\textasciitilde{} \textless{}\textbf{u}\textgreater 下划线\textless/\textbf{u}\textgreater{} \emph{\textbf{`行内代码`}} \textbf{==高亮文本==} \_\_\_分隔线 + +包含反引号的代码:当代码本身包含反引号时,使用两个反引号包围,使用 `code` 这样的格式 + +\textbf{列表}: 列表可以嵌套使用 + +- 无序列表项1 + +- 无序列表项2 + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 有序列表项1 +\end{enumerate} + +\begin{verbatim} +2. 有序列表项2 +\end{verbatim} + +- {[} {]} 未完成的任务 + +\begin{verbatim} +- [x] 已完成的任务 +\end{verbatim} + +\textbf{链接与图片}: + +{[}链接文字{]}(https://example.com) \textless!-\/- 行内链接 -\/-\textgreater{}\\ +{[}链接文字{]}{[}1{]} \textless!-\/- 参考式链接 -\/-\textgreater{}\\ +{[}跳转到基础{]}(\#基础) \textless!-\/- 锚点链接 -\/-\textgreater{}\\ +\strut \\ +{[}1{]}: https://www.example.com \textless!-\/- 参考链接定义 -\/-\textgreater{}\\ +\strut \\ +!{[}图片说明{]}(image.png) \textless!-\/- 基本图片 -\/-\textgreater{}\\ +*图7.8 路杀动物* \textless!-\/- 图片下方用斜体作为图注 -\/-\textgreater{}\\ +\strut \\ +\textless!-\/- 图片居中对齐并指定宽度 -\/-\textgreater{}\\ +\textless div align="center"\textgreater{}\\ +\textless img src="image.png" alt="说明" style="width:10cm;"/\textgreater{}\\ +\textless p\textgreater\textless em\textgreater 图片标题\textless/em\textgreater\textless/p\textgreater{}\\ +\textless/div\textgreater{} + +\textbf{代码块}: + +\emph{\textbf{```python}}\\ +print("Hello, World!")\\ +\emph{\textbf{```}} + +带行号的代码区块(需要渲染器支持,如 Docusaurus、VuePress): + +\emph{\textbf{```javascript linenums="1"}}\\ +\emph{\textbf{function greet(name) \{}}\\ +\emph{\textbf{console.log(`Hello, \$\{name\}!{\kern0pt}`);}}\\ +\emph{\textbf{\}}}\\ +\emph{\textbf{```}} + +表格: + +\textbar{} 列1 \textbar{} 列2 \textbar{} 列3 \textbar{}\\ +\textbar-\/-\/-\/-\/-\textbar-\/-\/-\/-\/-\textbar-\/-\/-\/-\/-\textbar{}\\ +\textbar{} 内容 \textbar{} 内容 \textbar{} 内容 \textbar{} + +对齐方式::-\/-\/- 左对齐,:-\/-\/-: 居中,-\/-\/-: 右对齐: + +\textbar{} 左对齐 \textbar{} 居中对齐 \textbar{} 右对齐 \textbar{}\\ +\textbar{} :-\/-\/-\/-\/- \textbar{} :-\/-\/-\/-\/-\/-: \textbar{} -\/-\/-\/-\/-: \textbar{}\\ +\textbar{} 内容 \textbar{} 内容 \textbar{} 100 \textbar{} + +\textbf{注记}: 输入后在Obsidian编辑器中会自动弹出添加注记模块 + +脚注{[}\^{}1{]} + +\textbf{引用}: + +\textgreater{} 这是一段引用文字\\ +\strut \\ +\textgreater{} 多级嵌套引用\\ +\textgreater{} \textgreater{} 第二层\\ +\textgreater{} \textgreater{} \textgreater{} 第三层\\ +\strut \\ +\textgreater{} **本章要点**\\ +\textgreater{}\\ +\textgreater{} - 了解项目背景和目标\\ +\textgreater{} - 掌握核心功能特性 + +\subparagraph{图表绘制(Mermaid):} + +使用 ```mermaid 代码块,部分渲染器(GitHub、Typora、Obsidian)支持: + +流程图: + +\emph{\textbf{```mermaid}} + +\emph{\textbf{graph LR}} + +\begin{enumerate} +\def\labelenumi{\Alph{enumi}.} +\item + \emph{\textbf{{[}开始{]} -\/-\textgreater{} B\{条件判断\}}} +\item + \emph{\textbf{-\/-\textgreater\textbar 是\textbar{} C{[}执行操作1{]}}} +\item + \emph{\textbf{-\/-\textgreater\textbar 否\textbar{} D{[}执行操作2{]}}} +\item + \emph{\textbf{-\/-\textgreater{} E{[}结束{]}}} +\item + \emph{\textbf{-\/-\textgreater{} E}} +\end{enumerate} + +\emph{\textbf{```}} + +时序图: + +\emph{\textbf{```mermaid}}\\ +\emph{\textbf{sequenceDiagram}}\\ +\emph{\textbf{participant 用户}}\\ +\emph{\textbf{participant 系统}}\\ +\emph{\textbf{用户-\textgreater\textgreater 系统: 登录请求}}\\ +\emph{\textbf{系统-\/-\textgreater\textgreater 用户: 返回结果}}\\ +\emph{\textbf{```}} + +甘特图: + +\emph{\textbf{```mermaid}}\\ +\emph{\textbf{gantt}}\\ +\emph{\textbf{title 项目计划}}\\ +\emph{\textbf{dateFormat YYYY-MM-DD}}\\ +\emph{\textbf{section 设计}}\\ +\emph{\textbf{需求分析 :done, 2024-01-01, 15d}}\\ +\emph{\textbf{section 开发}}\\ +\emph{\textbf{编码实现 :active, 2024-01-16, 30d}}\\ +\emph{\textbf{```}} + +饼图: + +\emph{\textbf{```mermaid}}\\ +\emph{\textbf{pie}}\\ +\emph{\textbf{title 市场份额}}\\ +\emph{\textbf{"Chrome" : 65}}\\ +\emph{\textbf{"Safari" : 15}}\\ +\emph{\textbf{"其他" : 20}}\\ +\emph{\textbf{```}} + +\textbf{数学公式}: + +行内公式用 \$...\$,块级公式用 \$\$...\$\$,语法基于 LaTeX: + +质能方程 \$E = mc\^{}2\$,其中 \$c\$ 为光速。 + +\[\int_{- \infty}^{\infty}e^{- x^{2}}dx = \sqrt{\pi}\] + +多行对齐公式: + +\[\begin{aligned} +f(x) & = ax^{2} + bx + c \\ +f'(x) & = 2ax + b +\end{aligned}\] + +矩阵: + +\[\begin{pmatrix} +a & b \\ +c & d +\end{pmatrix}\] + +\paragraph{Obsidian:Markdown笔记工具}\label{obsidianmarkdownux7b14ux8bb0ux5de5ux5177} + +\href{https://obsidian.md/}{Obsidian} 是一款基于Markdown的知识管理工具,适合构建个人知识库和笔记系统。 + +\textbf{核心特性}: - \textbf{本地存储}:所有笔记以Markdown文件保存在本地,数据完全自主 - \textbf{双向链接}:用 {[}{[}笔记名{]}{]} 在笔记之间建立链接,形成知识网络 - \textbf{图谱视图}:可视化笔记之间的关联关系 - \textbf{插件生态}:丰富的社区插件扩展功能(如日历、看板、模板等) - \textbf{实时预览}:编辑Markdown时实时渲染效果 + +\textbf{使用建议}: - 用Obsidian打开本教材的根目录,即可获得完整的阅读与编辑体验 - 建议安装''目录''插件,方便在长文档中快速导航 - 利用双向链接功能,将学习笔记与教材内容关联起来 + +\subsubsection{Git版本管理与GitHub协作}\label{gitux7248ux672cux7ba1ux7406ux4e0egithubux534fux4f5c} + +\paragraph{为什么需要版本管理} + +在项目开发过程中,文件会不断修改。版本管理工具可以: - 记录每一次修改的内容和时间 - 随时回退到之前的任意版本 - 多人协作时避免互相覆盖 + +Git是当前最流行的分布式版本管理系统。 + +\paragraph{Git基础操作}\label{gitux57faux7840ux64cdux4f5c} + +\subparagraph{初始化仓库:} + +\emph{\# 在项目目录中初始化Git}\\ +cd my\_project\\ +git init + +\subparagraph{日常三步曲:} + +\emph{\# 1. 查看当前修改状态}\\ +git status\\ +\strut \\ +\emph{\# 2. 将修改添加到暂存区}\\ +git add filename.md \emph{\# 添加指定文件}\\ +git add . \emph{\# 添加所有修改}\\ +\strut \\ +\emph{\# 3. 提交修改(附带说明)}\\ +git commit -m "添加了数据预处理功能" + +\textbf{查看历史}: + +\emph{\# 查看提交历史}\\ +git log -\/-oneline\\ +\strut \\ +\emph{\# 查看某次提交的具体改动}\\ +git show abc1234 + +\textbf{回退操作}: + +\emph{\# 查看某文件的历史版本}\\ +git log -\/- filename.md\\ +\strut \\ +\emph{\# 恢复某个文件到指定版本}\\ +git checkout abc1234 -\/- filename.md + +\paragraph{GitHub:云端协作平台}\label{githubux4e91ux7aefux534fux4f5cux5e73ux53f0} + +\href{https://github.com/}{GitHub} 是基于Git的代码托管平台,提供云端存储和协作功能。 + +\textbf{核心概念}: - \textbf{仓库(Repository)}:项目的存储空间,包含所有文件和历史记录 - \textbf{远程同步}:将本地仓库推送到GitHub,或从GitHub拉取更新 - \textbf{协作}:多人通过分支和合并协同工作 + +\textbf{常用操作}: + +\emph{\# 关联远程仓库}\\ +git remote add origin https://github.com/username/project.git\\ +\strut \\ +\emph{\# 推送到远程}\\ +git push -u origin main\\ +\strut \\ +\emph{\# 从远程拉取更新}\\ +git pull + +\textbf{本书的Git管理}: + +本书内容即通过Git进行版本管理。每个章节的修改都有完整的提交记录,可以通过 git log 查看内容的演变历史。 + +\paragraph{推荐工作流} + +对于设计专业的学习和研究项目,建议采用以下简化工作流: + +编写/修改文档 → git add → git commit → git push + +每次完成一个阶段性工作(如写完一节内容、完成一次实验)后提交一次,附上简洁的说明。这样既保留了完整的历史记录,也不会因为误操作而丢失工作成果。 + diff --git a/appendices/ap03-academic-writing.tex b/appendices/ap03-academic-writing.tex new file mode 100644 index 0000000..cff6ebd --- /dev/null +++ b/appendices/ap03-academic-writing.tex @@ -0,0 +1,114 @@ +\chapter{附录3:学术论文撰写工作流} + +本附录介绍文献检索管理、论文写作工具、AI辅助写作流程及引用格式规范。 + +\subsection{文献检索与管理} + +\subsubsection{检索平台} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1899}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1965}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2117}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +平台 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +网址 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Google Scholar & 综合学术搜索 & \href{https://scholar.google.com/}{scholar.google.com} \\ +arXiv & AI领域预印本 & \href{https://arxiv.org/}{arxiv.org} \\ +Semantic Scholar & AI辅助文献搜索 & \href{https://www.semanticscholar.org/}{semanticscholar.org} \\ +CNKI & 中文学术文献 & \href{https://www.cnki.net/}{cnki.net} \\ +\end{longtable} +} + +\subsubsection{文献管理工具} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.1184}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.3303}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +工具 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Zotero & 免费、开源、支持浏览器插件 \\ +Mendeley & PDF标注与协作 \\ +EndNote & 功能全面、与Word深度集成 \\ +\end{longtable} +} + +\subsection{论文写作工具} + +\subsubsection{LaTeX}\label{latex} + +学术排版的行业标准,适合公式密集的论文。 + +\begin{itemize} +\item + \textbf{在线编辑}:\href{https://www.overleaf.com/}{Overleaf} --- 无需本地安装,支持协作 +\item + \textbf{本地编辑}:TeX Live + VSCode LaTeX Workshop 插件 +\end{itemize} + +\subsubsection{Markdown + Pandoc}\label{markdown-pandoc} + +轻量级写作方案,适合课程报告和技术文档。 + +\emph{\# Markdown 转 Word / PDF}\\ +pandoc paper.md -o paper.docx\\ +pandoc paper.md -o paper.pdf -\/-pdf-engine=xelatex + +\subsection{AI辅助写作流程}\label{aiux8f85ux52a9ux5199ux4f5cux6d41ux7a0b} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \textbf{文献综述}:使用 ChatGPT/Claude 快速了解研究领域的核心文献和发展脉络 +\item + \textbf{大纲生成}:通过AI辅助梳理论文结构和逻辑框架 +\item + \textbf{段落撰写}:AI辅助润色语言表达、翻译中英文 +\item + \textbf{格式排版}:利用模板和工具自动处理格式 +\end{enumerate} + +注意:AI辅助写作应遵循学术诚信原则,AI生成的内容需人工审核和改写,核心观点和论证应由作者独立完成。 + +\subsection{引用与格式规范} + +\subsubsection{常用引用格式} + +\begin{itemize} +\item + \textbf{APA}:社会科学常用 +\item + \textbf{IEEE}:工程和计算机科学常用 +\item + \textbf{GB/T 7714}:中国国家标准 +\end{itemize} + +\subsubsection{BibTeX示例}\label{bibtexux793aux4f8b} + +@article\{vaswani2017attention,\\ +title=\{Attention is all you need\},\\ +author=\{Vaswani, Ashish and others\},\\ +journal=\{NeurIPS\},\\ +volume=\{30\},\\ +year=\{2017\}\\ +\} + diff --git a/appendices/ap04-web-tools.tex b/appendices/ap04-web-tools.tex new file mode 100644 index 0000000..901c074 --- /dev/null +++ b/appendices/ap04-web-tools.tex @@ -0,0 +1,451 @@ +\chapter{附录4:网络、网站与在线可视化} + +本附录介绍网络基础知识、网站搭建入门,以及在线数据可视化的工具与方法。 + +\subsection{网络基础知识} + +\subsubsection{互联网与Web} + +互联网(Internet)是由全球计算机互相连接而成的网络。Web(万维网)是运行在互联网上的信息系统,通过浏览器访问网页来获取信息。 + +\textbf{核心概念}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.1617}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.6553}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +概念 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +URL & 统一资源定位符,即网页地址(如 https://example.com/page) \\ +HTTP/HTTPS & 浏览器与服务器之间传输数据的协议,HTTPS 为加密版本 \\ +HTML & 网页的骨架,定义页面结构和内容 \\ +CSS & 网页的样式,控制颜色、字体、布局等外观 \\ +JavaScript & 网页的行为,实现交互功能和动态效果 \\ +API & 应用程序接口,程序之间交换数据的标准方式 \\ +\end{longtable} +} + +\subsubsection{前端与后端} + +一个完整的Web应用由前端和后端两部分组成: + +用户浏览器(前端) ←→ 服务器(后端) ←→ 数据库\\ +HTML/CSS/JS Python/Node.js MySQL/PostgreSQL + +\textbf{前端}:用户在浏览器中看到和操作的界面,使用 HTML、CSS、JavaScript 构建。 + +\textbf{后端}:运行在服务器上的程序,处理数据逻辑、存储和检索,可以用 Python(Flask/Django/FastAPI)、Node.js、Java 等实现。 + +\subsubsection{API与数据交互}\label{apiux4e0eux6570ux636eux4ea4ux4e92} + +API(Application Programming Interface)是程序之间通信的接口。在AI应用中,调用大语言模型、获取在线数据等操作都通过API完成。 + +\textbf{RESTful API 基本概念}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1134}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2835}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +方法 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +用途 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +示例 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +GET & 获取数据 & 获取模型列表 \\ +POST & 提交数据 & 发送文本让模型生成回复 \\ +PUT & 更新数据 & 更新模型参数 \\ +DELETE & 删除数据 & 删除一条记录 \\ +\end{longtable} +} + +\textbf{调用API的Python示例}: + +\textbf{import} requests\\ +\strut \\ +\emph{\# 调用一个公开API获取数据}\\ +response = requests.get("https://api.example.com/models")\\ +data = response.json() \emph{\# 将返回的JSON解析为Python字典}\\ +print(data)\\ +\strut \\ +\emph{\# POST请求示例}\\ +payload = \{"prompt": "设计一个现代风格的客厅", "model": "stable-diffusion"\}\\ +response = requests.post("https://api.example.com/generate", json=payload) + +\subsubsection{JSON数据格式}\label{jsonux6570ux636eux683cux5f0f} + +JSON(JavaScript Object Notation)是Web上最常用的数据交换格式,几乎所有API都使用JSON传递数据。 + +\{\\ +"model": "ResNet",\\ +"accuracy": 0.96,\\ +"layers": {[}64, 128, 256, 512{]},\\ +"metadata": \{\\ +"author": "He et al.",\\ +"year": 2015\\ +\}\\ +\} + +Python中读写JSON: + +\textbf{import} json\\ +\strut \\ +\emph{\# Python字典 → JSON字符串}\\ +data = \{"name": "Transformer", "year": 2017\}\\ +json\_str = json.dumps(data, indent=2)\\ +\strut \\ +\emph{\# JSON字符串 → Python字典}\\ +parsed = json.loads(json\_str) + +\subsection{网站搭建入门} + +\subsubsection{静态网站与动态网站} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1187}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3546}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2633}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2366}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +类型 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +技术栈 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +适用场景 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +静态网站 & 页面内容固定,无需服务器处理 & HTML/CSS/JS & 作品集、项目文档 \\ +动态网站 & 内容根据请求动态生成 & 前端 + 后端 + 数据库 & 在线工具、数据平台 \\ +\end{longtable} +} + +\subsubsection{静态网站快速搭建} + +对于设计专业的学生,最实用的方式是使用静态网站生成器搭建项目展示或文档站点。 + +\textbf{MkDocs}:用Markdown编写内容,生成美观的文档网站。 + +\emph{\# 安装}\\ +pip install mkdocs mkdocs-material\\ +\strut \\ +\emph{\# 创建项目}\\ +mkdocs new my-site\\ +cd my-site\\ +\strut \\ +\emph{\# 本地预览(浏览器访问 http://127.0.0.1:8000)}\\ +mkdocs serve\\ +\strut \\ +\emph{\# 构建静态文件}\\ +mkdocs build + +\textbf{GitHub Pages}:将静态网站免费部署到互联网。 + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 在GitHub上创建仓库 +\item + 将网站文件推送到仓库 +\item + 在仓库设置中启用 GitHub Pages +\item + 即可通过 https://username.github.io/repo 访问 +\end{enumerate} + +\subsubsection{HTML/CSS/JavaScript 速览}\label{htmlcssjavascript-ux901fux89c8} + +\paragraph{HTML:页面结构}\label{htmlux9875ux9762ux7ed3ux6784} + +\textless!DOCTYPE html\textgreater{}\\ +\textless{}\textbf{html}\textgreater{}\\ +\textless{}\textbf{head}\textgreater{}\\ +\textless{}\textbf{title}\textgreater 我的设计作品集\textless/\textbf{title}\textgreater{}\\ +\textless/\textbf{head}\textgreater{}\\ +\textless{}\textbf{body}\textgreater{}\\ +\textless{}\textbf{h1}\textgreater 设计作品集\textless/\textbf{h1}\textgreater{}\\ +\textless{}\textbf{p}\textgreater 欢迎来到我的作品展示页面\textless/\textbf{p}\textgreater{}\\ +\textless{}\textbf{img} src="design.jpg" alt="设计作品"\textgreater{}\\ +\textless{}\textbf{a} href="https://example.com"\textgreater 了解更多\textless/\textbf{a}\textgreater{}\\ +\textless/\textbf{body}\textgreater{}\\ +\textless/\textbf{html}\textgreater{} + +\paragraph{CSS:页面样式}\label{cssux9875ux9762ux6837ux5f0f} + +body \{\\ +\textbf{font-family}: "Helvetica", sans-serif;\\ +\textbf{max-width}: 800px;\\ +\textbf{margin}: 0 auto;\\ +\textbf{padding}: 20px;\\ +\}\\ +\strut \\ +h1 \{\\ +\textbf{color}: \#2c3e50;\\ +\textbf{text-align}: center;\\ +\} + +\paragraph{JavaScript:页面交互}\label{javascriptux9875ux9762ux4ea4ux4e92} + +\emph{// 点击按钮时显示消息}\\ +document.getElementById("myButton").addEventListener("click", \textbf{function}() \{\\ +alert("按钮被点击了!");\\ +\}); + +\subsubsection{前端框架简介} + +对于更复杂的Web应用,可以使用前端框架提升开发效率: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1107}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3071}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3379}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +框架 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +适用场景 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Vue.js & 渐进式框架,学习曲线平缓 & 交互式数据展示 \\ +React & 组件化开发,生态最丰富 & 复杂单页应用 \\ +Streamlit & Python编写Web应用 & AI模型展示、数据分析仪表板 \\ +\end{longtable} +} + +\textbf{Streamlit 示例}(用Python快速构建AI展示页面): + +\textbf{import} streamlit \textbf{as} st + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + title("图像分类演示") +\end{enumerate} + +st.write("上传一张图片,AI将识别其中的内容") + +\begin{verbatim} +\end{verbatim} + +uploaded\_file = st.file\_uploader("选择图片", type={[}"jpg", "png"{]}) + +\textbf{if} uploaded\_file: + +st.image(uploaded\_file, caption="上传的图片") + +\begin{verbatim} + st.write("分类结果:建筑(置信度 95%)") +\end{verbatim} + +\emph{\# 安装并运行}\\ +pip install streamlit\\ +streamlit run app.py + +\subsubsection{网站部署方式} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3137}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2835}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +方式 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +费用 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +GitHub Pages & 适合静态网站,免费 & 免费 \\ +Vercel / Netlify & 支持前端框架自动部署 & 免费额度 \\ +云服务器(阿里云/腾讯云) & 完全控制,适合动态网站 & 按需付费 \\ +Hugging Face Spaces & 适合AI模型演示 & 免费额度 \\ +\end{longtable} +} + +\subsection{在线数据可视化} + +\subsubsection{为什么需要数据可视化} + +设计领域的AI研究和实践经常涉及数据展示:训练损失曲线、模型性能对比、空间数据分析结果等。数据可视化将抽象的数字转化为直观的图形,帮助理解和决策。 + +\subsubsection{Python可视化库}\label{pythonux53efux89c6ux5316ux5e93} + +Matplotlib:基础绑图 + +\textbf{import} matplotlib.pyplot \textbf{as} plt\\ +\strut \\ +\emph{\# 折线图}\\ +epochs = range(1, 11)\\ +train\_loss = {[}0.9, 0.6, 0.4, 0.25, 0.15, 0.1, 0.07, 0.05, 0.04, 0.03{]}\\ +val\_loss = {[}0.85, 0.65, 0.45, 0.35, 0.28, 0.25, 0.24, 0.23, 0.23, 0.24{]}\\ +\strut \\ +plt.figure(figsize=(8, 5))\\ +plt.plot(epochs, train\_loss, \textquotesingle b-o\textquotesingle, label=\textquotesingle Train Loss\textquotesingle)\\ +plt.plot(epochs, val\_loss, \textquotesingle r-s\textquotesingle, label=\textquotesingle Val Loss\textquotesingle)\\ +plt.xlabel(\textquotesingle Epoch\textquotesingle)\\ +plt.ylabel(\textquotesingle Loss\textquotesingle)\\ +plt.title(\textquotesingle Training vs Validation Loss\textquotesingle)\\ +plt.legend()\\ +plt.grid(True, alpha=0.3)\\ +plt.savefig(\textquotesingle loss\_comparison.png\textquotesingle, dpi=150, bbox\_inches=\textquotesingle tight\textquotesingle)\\ +plt.show() + +\paragraph{Seaborn:统计可视化}\label{seabornux7edfux8ba1ux53efux89c6ux5316} + +基于Matplotlib,提供更美观的统计图表。 + +\textbf{import} seaborn \textbf{as} sns\\ +\strut \\ +\emph{\# 热力图:相关性矩阵}\\ +\textbf{import} numpy \textbf{as} np\\ +data = np.random.randn(10, 10)\\ +corr = np.corrcoef(data)\\ +\strut \\ +sns.heatmap(corr, annot=True, cmap=\textquotesingle coolwarm\textquotesingle)\\ +plt.title(\textquotesingle Feature Correlation Heatmap\textquotesingle)\\ +plt.savefig(\textquotesingle heatmap.png\textquotesingle, dpi=150) + +\paragraph{Plotly:交互式可视化}\label{plotlyux4ea4ux4e92ux5f0fux53efux89c6ux5316} + +支持鼠标悬停、缩放、导出等交互操作,适合Web展示。 + +\textbf{import} plotly.express \textbf{as} px\\ +\strut \\ +\emph{\# 交互式散点图}\\ +df = px.data.iris()\\ +fig = px.scatter(df, x="sepal\_width", y="sepal\_length",\\ +color="species", size="petal\_length",\\ +title="Iris Dataset Scatter Plot")\\ +fig.write\_html("scatter.html") \emph{\# 导出为网页}\\ +fig.show() + +\subsubsection{在线可视化工具} + +无需编程,通过网页界面即可创建可视化: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1646}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3405}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2036}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +工具 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +网址 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Observable & JavaScript驱动的交互式笔记本 & \href{https://observablehq.com/}{observablehq.com} \\ +Flourish & 拖拽式数据可视化,模板丰富 & \href{https://flourish.studio/}{flourish.studio} \\ +Datawrapper & 适合制作新闻级图表 & \href{https://www.datawrapper.de/}{datawrapper.de} \\ +Tableau Public & 强大的商业智能可视化 & \href{https://public.tableau.com/}{public.tableau.com} \\ +ECharts & 百度开源的交互式图表库 & \href{https://echarts.apache.org/}{echarts.apache.org} \\ +\end{longtable} +} + +\subsubsection{地理空间可视化} + +设计领域经常涉及地理和空间数据的可视化: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1113}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3837}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2364}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +工具 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +适用场景 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Folium & Python地图可视化库 & 在地图上标注数据点 \\ +Kepler.gl & Uber开源的大规模地理数据可视化 & 城市数据分析 \\ +Mapbox & 自定义地图样式 & 设计精美的交互地图 \\ +QGIS & 开源GIS桌面软件 & 空间分析与制图 \\ +\end{longtable} +} + +\textbf{Folium 示例}(在地图上标记位置): + +\textbf{import} folium\\ +\strut \\ +\emph{\# 创建地图(以某坐标为中心)}\\ +m = folium.Map(location={[}39.9, 116.4{]}, zoom\_start=12)\\ +\strut \\ +\emph{\# 添加标记}\\ +folium.Marker(\\ +{[}39.9, 116.4{]},\\ +popup="设计学院",\\ +icon=folium.Icon(color="blue", icon="info-sign")\\ +).add\_to(m)\\ +\strut \\ +\emph{\# 保存为网页}\\ +m.save("map.html") + +\subsubsection{可视化设计原则} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.2361}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.6363}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +原则 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +选择合适的图表类型 & 比较→柱状图,趋势→折线图,占比→饼图,关系→散点图 \\ +保持简洁 & 每张图只传达一个核心信息,避免过度装饰 \\ +使用合理的色彩 & 同类数据用同色系,对比数据用对比色,注意色盲友好 \\ +标注清晰 & 标题、轴标签、图例、数据来源缺一不可 \\ +交互增强 & 在线可视化支持筛选、缩放、悬停查看详情 \\ +\end{longtable} +} + diff --git a/appendices/ap05-online-resources.tex b/appendices/ap05-online-resources.tex new file mode 100644 index 0000000..dc9162c --- /dev/null +++ b/appendices/ap05-online-resources.tex @@ -0,0 +1,74 @@ +\chapter{附录5:在线学习资源} + +本附录整理AI学习过程中常用的在线课程、技术博客与文档、以及公开数据集。 + +\subsection{推荐课程} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2921}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1101}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2141}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +名称 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +平台 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +链接 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +CS231n:计算机视觉 & Stanford & \href{http://cs231n.stanford.edu/}{cs231n.stanford.edu} \\ +Fast.ai:实用深度学习 & fast.ai & \href{https://course.fast.ai/}{course.fast.ai} \\ +吴恩达深度学习专项课 & Coursera & \href{https://www.coursera.org/specializations/deep-learning}{coursera.org} \\ +CS224n:NLP与深度学习 & Stanford & \href{https://web.stanford.edu/class/cs224n/}{web.stanford.edu} \\ +李宏毅机器学习 & YouTube & \href{https://www.youtube.com/c/HungyiLeeNTU}{youtube.com} \\ +\end{longtable} +} + +\subsection{博客与文档} + +\begin{itemize} +\item + \href{https://lilianweng.github.io/}{Lil'Log} - AI深度技术文章 +\item + \href{https://jalammar.github.io/illustrated-transformer/}{The Illustrated Transformer} - 可视化原理解析 +\item + \href{https://distill.pub/}{Distill.pub} - 交互式可视化论文 +\item + \href{https://pytorch.org/docs/}{PyTorch官方文档} +\item + \href{https://docs.ultralytics.com/}{Ultralytics YOLO文档} +\item + \href{https://python.langchain.com/}{LangChain文档} +\end{itemize} + +\subsection{数据集} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1735}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1987}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +数据集 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +内容 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +链接 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +ImageNet & 图像分类 & \href{https://www.image-net.org/}{image-net.org} \\ +COCO & 目标检测 & \href{https://cocodataset.org/}{cocodataset.org} \\ +MNIST & 手写数字 & \href{http://yann.lecun.com/exdb/mnist/}{yann.lecun.com} \\ +OpenStreetMap & 地图数据 & \href{https://www.openstreetmap.org/}{openstreetmap.org} \\ +\end{longtable} +} + diff --git a/appendices/ap06-more-resources.tex b/appendices/ap06-more-resources.tex new file mode 100644 index 0000000..1a0eb80 --- /dev/null +++ b/appendices/ap06-more-resources.tex @@ -0,0 +1,75 @@ +\chapter{附录6:其他资源} + +本附录整理AIGC工具、设计领域AI工具,以及设计AI相关的学术期刊与会议。 + +\subsection{AIGC工具}\label{aigcux5de5ux5177} + +\subsubsection{Stable Diffusion}\label{stable-diffusion} + +\textbf{WebUI}:\href{https://github.com/AUTOMATIC1111/stable-diffusion-webui}{Automatic1111} + +\textbf{ComfyUI}:\href{https://github.com/comfyanonymous/ComfyUI}{GitHub} + +\textbf{API调用示例}: + +\textbf{from} diffusers \textbf{import} StableDiffusionPipeline\\ +\strut \\ +pipe = StableDiffusionPipeline.from\_pretrained("runwayml/stable-diffusion-v1-5")\\ +image = pipe("a photo of an astronaut riding a horse on mars").images{[}0{]} + +\subsubsection{Midjourney}\label{midjourney} + +\textbf{平台}:Discord \textbf{文档}:\href{https://docs.midjourney.com/}{docs.midjourney.com} + +\subsection{设计领域AI工具} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1790}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2364}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1779}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +工具 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +用途 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +网址 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Midjourney & 图像生成与创意探索 & \href{https://www.midjourney.com/}{midjourney.com} \\ +Stable Diffusion & 本地可控图像生成 & \href{https://stability.ai/}{stability.ai} \\ +ControlNet & 精确结构控制 & \href{https://arxiv.org/abs/2302.05543}{arxiv.org} \\ +Figma AI & 界面设计辅助 & \href{https://www.figma.com/}{figma.com} \\ +Galileo AI & 界面布局生成 & \href{https://www.usegalileo.ai/}{usegalileo.ai} \\ +Planner 5D & 室内设计自动生成 & \href{https://planner5d.com/}{planner5d.com} \\ +\end{longtable} +} + +\subsection{学术期刊与会议} + +\subsubsection{设计AI相关期刊} + +\begin{itemize} +\item + Landscape and Urban Planning +\item + Environment and Planning B: Urban Analytics and City Science +\item + Automation in Construction +\end{itemize} + +\subsubsection{设计AI相关会议} + +\begin{itemize} +\item + CAAD Futures +\item + ACADIA +\item + eCAADe +\end{itemize} + diff --git a/appendices/ap07-references.tex b/appendices/ap07-references.tex new file mode 100644 index 0000000..4f2fb3e --- /dev/null +++ b/appendices/ap07-references.tex @@ -0,0 +1,4 @@ +\chapter{附录7:参考文献} + +本部分整理教材中引用的论文、书籍和在线资源。 + diff --git a/appendices/ap08-glossary.tex b/appendices/ap08-glossary.tex new file mode 100644 index 0000000..89c0075 --- /dev/null +++ b/appendices/ap08-glossary.tex @@ -0,0 +1,48 @@ +\chapter{附录8:关键术语表} + +本附录按章节整理书中涉及的关键中英文术语。 + +\subsection{第二章} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1635}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2921}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.5444}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +数据模态 & Data Modality & 信息的存在形式,如文本、图像、三维等 \\ +线性回归 & Linear Regression & \(y = ax + b\) 形式的函数拟合 \\ +多元回归 & Multiple Regression & 多输入变量的线性模型 \(y = \sum a_{i}x_{i} + b\) \\ +多层感知机 & Multi-Layer Perceptron (MLP) & 最基础的前馈神经网络结构 \\ +前向传播 & Forward Propagation & 数据从输入层到输出层的计算过程 \\ +激活函数 & Activation Function & 引入非线性的函数,如ReLU、Sigmoid \\ +损失函数 & Loss Function & 衡量预测值与真实值差距的函数 \\ +反向传播 & Backpropagation & 利用链式法则计算梯度的算法 \\ +梯度下降 & Gradient Descent & 沿梯度反方向更新参数的优化方法 \\ +学习率 & Learning Rate & 梯度下降中控制参数更新步长的超参数 \\ +权重 & Weight & 神经元之间连接的可学习参数 \\ +偏置 & Bias & 调整输出基准的可学习参数 \\ +特征工程 & Feature Engineering & 人工设计和提取数据特征的过程 \\ +迁移学习 & Transfer Learning & 将一个任务学到的知识迁移到新任务 \\ +基础模型 & Foundation Model & 在大规模数据上预训练的大型通用模型 \\ +涌现能力 & Emergent Abilities & 模型规模大到一定程度后出现的新能力 \\ +缩放定律 & Scaling Law & 模型性能与规模(数据量、参数量、计算量)之间的关系规律 \\ +环境-智能体-任务 & Environment-Agent-Task & AI实践的三元框架:环境提供操作空间,智能体执行任务,任务定义目标 \\ +Vibe Coding & Vibe Coding & 感觉驱动编程,用自然语言描述需求让AI生成代码的编程范式 \\ +全连接层 & Fully Connected Layer & 每个神经元与上一层所有神经元相连的网络层 \\ +预训练 & Pre-training & 在大规模数据上的初始训练阶段 \\ +微调 & Fine-tuning & 在特定任务数据上对预训练模型进行适配训练 \\ +\end{longtable} +} + diff --git a/appendices/ap09-tips.tex b/appendices/ap09-tips.tex new file mode 100644 index 0000000..717b5da --- /dev/null +++ b/appendices/ap09-tips.tex @@ -0,0 +1,8 @@ +\chapter{附录9:Tips} + +\begin{itemize} +\item + 用AI学习AI,大大减少了学习的时间和难度:例如markdown等语法,只需要学习两部分内容:1)掌握经常性的手动输入需要的内容,例如\#,- 等,2)了解剩余的语法的大致机制,例如图片插入可以使用html语法,公式排版使用的是Latex语法,具体实现时让AI撰写。 +\item + 有任何不懂的问题,直接问AI,如Claude code等CLI Agent以及在线等的大模型 +\end{itemize} diff --git a/chapters/ch00-preface.tex b/chapters/ch00-preface.tex new file mode 100644 index 0000000..19f0d61 --- /dev/null +++ b/chapters/ch00-preface.tex @@ -0,0 +1,47 @@ +\chapter{自序} + +\section{为什么要写这本书} + +2022年底,ChatGPT的发布如同一声惊雷,让生成式人工智能一夜之间走入大众视野。此后短短两年间,AI技术以惊人的速度迭代演进——从文本对话到多模态理解,从被动应答到自主行动,从实验室探索到千行百业的应用落地。在这场技术变革中,设计领域受到的冲击尤为深远。AI不仅能生成图像、辅助建模、优化方案,更在根本上改变了“设计”这件事的范式:设计师的角色正在从“执行者”转变为“引导者”和“策展人”,从亲手绘制每一个细节,转变为与AI协同探索更大的创意空间。 + +然而,观察众多设计专业的师生和从业者的实际状态后,可以发现一个普遍的困境:\textbf{大家都在谈论AI,但真正理解AI并能有效运用AI的人并不多。} +多数人对AI的使用停留在"输入提示词、获取结果"的表层,缺乏对技术原理的理解,也难以将AI真正融入自己的专业工作流。特别是对于设计专业的学生和从业者而言,虽然了解并使用了许多AI工具,但对很多专业术语和概念的理解仍停留在表面,难以触及背后的原理,这在很大程度上限制了研究与实践的深入。 + +尤其对于设计专业的学生来说,由于接触计算机和编程较少,缺乏进入这一领域的"语境",容易产生畏难情绪。而事实上,AI领域所涉及的终究是技术工程问题,并不存在玄学,在这个意义上理应能够被所有人掌握。梳理进入AI领域所需要的基本知识,归纳现代AI技术涉及的核心原理与沉淀的经验,并展示如何将其应用于设计学领域——从而为设计专业的学生、研究者和设计师提供切实的帮助,这正是本书的出发点。 + +\section{这本书讲什么} + +本书分为上下两篇,试图回答两个核心问题: + +\textbf{上篇}回答"AI是什么"——系统讲解AI的核心技术原理。面向设计专业读者,不追求面面俱到的数学推导,而是强调直觉理解:把神经网络看作函数组合,把注意力机制看作信息检索,把扩散模型看作逐步去噪。理解了这些基本原理,面对层出不穷的新工具和新模型,才能做到心中有数。 + +\textbf{下篇}回答"AI能做什么"——聚焦五大设计领域的AI应用实践。从数字媒体到环境设计,从工业设计到城市规划,再到生态设计,每个领域都结合具体场景,展示AI如何辅助分析、生成、优化和评估。 + +此外,附录中包含了大量与计算机和AI相关的基础知识与编程环境内容。虽然网络上有许多资源可供查询,但附录所收录的是实践过程中被认为最有必要了解和掌握的基本知识,也是开展设计人工智能研究的基础,因此以相当的篇幅进行了总结。更为详细的内容,可以参考书中所列的文献与技术文档资料。 + +\section{一些写作理念} + +在写作过程中,本书坚持了几个原则: + +\textbf{原理先行}。理解原理比掌握工具更重要。工具会过时,但原理具有持久的价值。因此,上篇用了较大篇幅讲解神经网络、注意力机制、扩散模型等核心概念。 + +\textbf{函数式视角}。本书刻意避免一上来就堆砌数学公式,而是从"函数描述世界"的朴素观念出发,让读者理解神经网络的本质——通过函数组合来学习数据中的规律。 + +\textbf{案例驱动}。每个技术概念都尽量配以设计领域的应用案例,让抽象的原理变得具体可感。 + +\textbf{中英双语术语}。AI领域的重要术语均保留英文原文,一方面便于读者查阅原始资料,另一方面也帮助建立专业词汇的准确认知。 + +\section{最后的话} + +AI技术仍在飞速发展,本书的内容不可避免地会随着时间推移而需要更新。但书中所传达的核心思想——理解原理、拥抱工具、人机协作——将具有持久的价值。 + +感谢AI技术本身——本书的写作过程中广泛使用了Claude、ChatGPT等AI工具进行资料整理、内容润色和代码验证,这本身就是"AI赋能工作"的一次实践。 + +设计的人工智能时代才刚刚开始。希望这本书能成为读者进入这个新时代的一块踏脚石,从而汇聚起万千努力,能够成为点燃"通用设计智能"的星星之火。 + + +\begin{flushright} +彭晓 + +2026年4月25日 +\end{flushright} diff --git a/chapters/ch01-intro.tex b/chapters/ch01-intro.tex new file mode 100644 index 0000000..f3d0e78 --- /dev/null +++ b/chapters/ch01-intro.tex @@ -0,0 +1,552 @@ +\chapter{导论} + +本章建立读者对人工智能的宏观认知框架。从 AI 的发展历程出发,回顾从早期符号主义到深度学习、再到大模型时代的关键技术突破与转折节点;进而梳理 AI 的范式演进,从感知智能到生成式智能、从单一任务到通用智能的发展脉络,帮助读者理解 AI 技术的全貌和未来趋势。 + + +\section{篇章导读} + +人工智能正在深刻改变设计的边界。从自动绘图到智能生成,从数据分析到自主决策,AI 技术为设计领域带来了前所未有的可能性。 + +本篇将回答两个核心问题: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + \textbf{AI 是什么,它将如何影响设计?} +\item + \textbf{AI 技术是如何演进的,我们应该关注哪些方向?} +\end{enumerate} + +通过本篇学习,你将建立对 AI 的宏观认知,理解技术发展的脉络,为后续深入学习打下基础。 + +\section{学习目标} + +\begin{itemize} +\tightlist +\item + 了解 AI 技术发展的关键时间节点 +\item + 理解 AI 四大赛道及其应用场景 +\item + 掌握设计领域 AI 应用的现状与趋势 +\item + 理解 AI 范式的三次演进 +\item + 掌握万能逼近定理的直观意义 +\item + 建立神经网络技术栈的完整认知 +\item + 理解 Scaling Law 与模型规模效应 +\end{itemize} + + +\section{第一部分:AI 与设计的交汇} + +\section{案例引入:Amazon Go} + +\subsection{案例背景} + +Amazon Go 是亚马逊推出的无人便利店,通过计算机视觉和传感器融合技术,实现''拿了就走''的购物体验。这一案例展示了多种 AI 技术如何协同工作,共同重构一个完整的线下场景。 + +\subsection{技术要素} + +Amazon Go 的 AI 技术栈融合了多项前沿技术: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +技术 & 作用 & 应用场景 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +5G 通信 & 低延迟数据传输 & 实时视频流处理 \\ +3D 传感器 & 深度信息获取 & 空间定位与手势识别 \\ +计算机视觉 & 图像理解 & 商品识别、行为分析 \\ +传感器融合 & 多源数据整合 & 精确定位与跟踪 \\ +\end{longtable} +} + +\subsection{启示} + +Amazon Go 展示了 AI 技术如何重构传统场景。从''扫码支付''到''拿了就走'',AI 让交互变得更加自然。这个案例也说明,设计领域中许多看似复杂的环境感知与交互问题,都可以通过多技术的组合来加以解决。 + +\section{AI 发展时间线(2016--2024)} + +\subsection{第一阶段:觉醒期(2016--2018)} + +\begin{itemize} +\tightlist +\item + \textbf{2016}:AlphaGo 击败李世石,AI 进入公众视野 +\item + \textbf{2017}:Transformer 架构诞生,为大模型时代奠基 +\item + \textbf{2018}:BERT 预训练模型问世,NLP 任务取得突破 +\end{itemize} + +\subsection{第二阶段:爆发期(2019--2022)} + +\begin{itemize} +\tightlist +\item + \textbf{2019}:GPT-2 展示强大的文本生成能力 +\item + \textbf{2020}:GPT-3 发布,少样本学习能力震惊业界 +\item + \textbf{2022}:ChatGPT 发布,AI 对话能力达到新高度 +\end{itemize} + +\subsection{第三阶段:应用期(2023--2024)} + +\begin{itemize} +\tightlist +\item + \textbf{2023}:多模态大模型、AI Agent 概念兴起 +\item + \textbf{2024}:具身智能、端侧 AI 加速落地 +\end{itemize} + +\section{AI 四大赛道} + +\subsection{AIGC(AI-Generated Content)}\label{aigcai-generated-content} + +\textbf{定义}:人工智能生成内容 + +\textbf{应用领域}: + +\begin{itemize} +\tightlist +\item + 文本生成:文章、报告、代码 +\item + 图像生成:设计稿、效果图、图标 +\item + 视频生成:短视频、动画、特效 +\item + 音频生成:音乐、配音、音效 +\end{itemize} + +\textbf{设计影响}:从''工具辅助''到''生成伙伴'' + +\subsection{Agent(智能体)} + +\textbf{定义}:能够自主感知、规划、执行的系统 + +\textbf{核心能力}: + +\begin{itemize} +\tightlist +\item + \textbf{感知(Perception)}:理解环境信息 +\item + \textbf{规划(Planning)}:制定行动方案 +\item + \textbf{记忆(Memory)}:存储和检索经验 +\item + \textbf{工具(Tool Use)}:调用外部资源 +\end{itemize} + +\textbf{设计影响}:从''被动执行''到''主动协作'' + +\subsection{AI4S(AI for Science)}\label{ai4sai-for-science} + +\textbf{定义}:AI 驱动科学发现 + +\textbf{应用领域}: + +\begin{itemize} +\tightlist +\item + 蛋白质结构预测(AlphaFold) +\item + 材料科学计算 +\item + 气候变化模拟 +\item + 城市系统优化 +\end{itemize} + +\textbf{设计影响}:数据驱动的设计决策 + +\subsection{AIED(AI in Education)}\label{aiedai-in-education} + +\textbf{定义}:AI 在教育领域的应用 + +\textbf{应用场景}: + +\begin{itemize} +\tightlist +\item + 个性化学习路径 +\item + 智能答疑与辅导 +\item + 学习行为分析 +\item + 知识图谱构建 +\end{itemize} + +\textbf{设计影响}:设计教育与人才培养模式变革 + +\section{设计领域 AI 应用趋势} + +\subsection{当前应用} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +领域 & AI 应用 & 成熟度 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +建筑设计 & 图纸生成、方案优化 & 中 \\ +景观设计 & 场地分析、植被配置 & 中 \\ +室内设计 & 家具布局、风格迁移 & 高 \\ +平面设计 & Logo 生成、排版辅助 & 高 \\ +交互设计 & 用户研究、原型生成 & 低 \\ +\end{longtable} +} + +\subsection{未来趋势} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + \textbf{从单点工具到系统化解决方案} +\item + \textbf{从生成内容到生成决策} +\item + \textbf{从人机协作到人机共生} +\end{enumerate} + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 选择你熟悉的设计领域,分析 AI 在该领域的应用现状和潜力。 +\item + 思考 AI 四大赛道中,哪一个对你的专业影响最大?为什么? +\item + Amazon Go 案例中,哪些 AI 技术可以迁移到设计领域? +\end{enumerate} + + +\section{第二部分:AI 范式演进} + +\section{AI 范式的三次演进} + +\subsection{第一范式:规则系统(Symbolic AI)} + +\textbf{时期}:1950s -- 1980s + +\textbf{核心思想}:人类专家编写规则 + +\textbf{特点}: + +\begin{itemize} +\tightlist +\item + 逻辑推理清晰 +\item + 知识表达明确 +\item + 泛化能力弱 +\end{itemize} + +\textbf{典型应用}:专家系统、棋类游戏 + +\subsection{第二范式:机器学习(Machine Learning)} + +\textbf{时期}:1990s -- 2010s + +\textbf{核心思想}:从数据中学习规律 + +\textbf{特点}: + +\begin{itemize} +\tightlist +\item + 数据驱动 +\item + 特征工程依赖专家经验 +\item + 任务特定 +\end{itemize} + +\textbf{典型应用}:推荐系统、图像分类、语音识别 + +\subsection{第三范式:深度学习(Deep Learning)} + +\textbf{时期}:2012 -- 至今 + +\textbf{核心思想}:端到端学习,自动提取特征 + +\textbf{特点}: + +\begin{itemize} +\tightlist +\item + 大数据驱动 +\item + 自动特征学习 +\item + 迁移学习能力强 +\end{itemize} + +\textbf{典型应用}:大语言模型、生成式 AI、自动驾驶 + +\section{万能逼近定理} + +\subsection{定理表述} + +\textbf{Universal Approximation Theorem(1989)}:一个具有足够多神经元的单隐藏层前馈神经网络,可以以任意精度逼近任何连续函数。 + +\subsection{直观理解} + +想象一张橡皮膜: + +\begin{itemize} +\tightlist +\item + 输入空间是平面上的点 +\item + 神经网络调整膜的形状 +\item + 神经元越多,膜的形变能力越强 +\item + 最终可以拟合任意复杂的曲面 +\end{itemize} + +\subsection{启示} + +这个定理告诉我们:\textbf{神经网络具有强大的表达能力,理论上可以学习任何复杂的映射关系}。这也是深度学习能够处理图像、语言、语音等复杂任务的数学基础。 + +\section{神经网络技术栈全景} + +\begin{lstlisting} +┌─────────────────────────────────────────────────────────────┐ +│ 应用层 │ +│ AIGC │ Agent │ AI4S │ AIED │ 空间智能 │ +├─────────────────────────────────────────────────────────────┤ +│ 模型层 │ +│ Diffusion │ Transformer │ GNN │ CNN │ MLP │ +├─────────────────────────────────────────────────────────────┤ +│ 算法层 │ +│ 反向传播 │ 注意力机制 │ 卷积 │ 池化 │ 激活函数 │ +├─────────────────────────────────────────────────────────────┤ +│ 数学层 │ +│ 微积分 │ 线性代数 │ 概率论 │ 优化理论 │ +└─────────────────────────────────────────────────────────────┘ +\end{lstlisting} + +\subsection{技术演进路径} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +时代 & 代表技术 & 突破点 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +1980s & MLP & 万能逼近定理 \\ +1990s & CNN & 局部连接、权重共享 \\ +2000s & RNN/LSTM & 序列建模 \\ +2010s & GNN & 图结构数据 \\ +2017 & Transformer & Self-Attention \\ +2020s & Diffusion & 生成质量突破 \\ +\end{longtable} +} + +\subsection{模型家族关系} + +\begin{lstlisting} +MLP(多层感知机) + │ + ┌──────────────┼──────────────┐ + │ │ │ + CNN GNN RNN + (空间数据) (图数据) (序列数据) + │ │ │ + └──────────────┼──────────────┘ + │ + Transformer + │ + ┌──────────────┼──────────────┐ + │ │ │ + GPT 系列 BERT Diffusion + (生成式) (理解式) (图像生成) +\end{lstlisting} + +\section{Scaling Law:规模即智能} + +\subsection{什么是 Scaling Law} + +Scaling Law(缩放定律)描述了模型性能与计算量、数据量、参数量之间的关系: + +\textbf{模型性能 ≈ f(计算量, 数据量, 参数量)} + +\subsection{核心发现} + +\textbf{1. 性能随规模对数增长} + +\begin{itemize} +\tightlist +\item + 模型越大,性能越好 +\item + 增长是可预测的 +\end{itemize} + +\textbf{2. 计算效率最关键} + +\begin{itemize} +\tightlist +\item + 计算量增加 10 倍 → 性能提升约 1.5 倍 +\item + 数据量和参数量也有类似规律 +\end{itemize} + +\textbf{3. 没有看到天花板} + +\begin{itemize} +\tightlist +\item + 在现有规模下,性能提升仍在继续 +\end{itemize} + +\subsection{启示} + +\begin{itemize} +\tightlist +\item + \textbf{大模型时代}:规模成为竞争壁垒 +\item + \textbf{数据为王}:高质量数据比模型架构更重要 +\item + \textbf{算力需求}:AI 发展依赖硬件进步 +\end{itemize} + +\section{从函数式视角看 AI 演进} + +\subsection{核心理念} + +\textbf{``Functions Describe the World''(函数描述世界)} + +\begin{itemize} +\tightlist +\item + 物理定律:F = ma +\item + 经济规律:Supply = Demand(Price) +\item + 神经网络:y = f(x; θ) +\end{itemize} + +\subsection{AI 即函数组合} + +\begin{lstlisting} +输入数据 x + │ + ▼ +┌─────────┐ +│ f₁(x) │ 第一层函数:特征提取 +└─────────┘ + │ + ▼ +┌─────────┐ +│ f₂(h) │ 第二层函数:模式识别 +└─────────┘ + │ + ▼ +┌─────────┐ +│ f₃(z) │ 第三层函数:决策输出 +└─────────┘ + │ + ▼ +输出 y +\end{lstlisting} + +\subsection{从 Excel 到神经网络} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}ll@{}} +\toprule\noalign{} +Excel & 神经网络 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +y = ax + b & 单层感知机 \\ +y = a₁x₁ + a₂x₂ + b & 多输入神经元 \\ +嵌套 IF 函数 & 多层网络 \\ +宏函数 & 自动微分 \\ +\end{longtable} +} + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 万能逼近定理告诉我们神经网络''能''做任何事,但没有说''如何''高效学习。这个区别意味着什么? +\item + Scaling Law 是否意味着''越大越好''?在资源有限的情况下,应该如何权衡? +\item + 从函数式视角理解 AI,对你理解设计问题有何启发? +\end{enumerate} + + +\section{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +生成式 AI & AIGC & AI-Generated Content \\ +智能体 & Agent & 自主决策系统 \\ +AI for Science & AI4S & AI 驱动科学研究 \\ +AI in Education & AIED & AI 教育应用 \\ +传感器融合 & Sensor Fusion & 多传感器数据整合 \\ +万能逼近定理 & Universal Approximation Theorem & 神经网络表达能力的理论保证 \\ +缩放定律 & Scaling Law & 模型性能与规模的关系 \\ +前馈网络 & Feed-Forward Network & 信息单向传播的神经网络 \\ +多层感知机 & MLP & Multi-Layer Perceptron \\ +端到端学习 & End-to-End Learning & 从输入直接学习到输出 \\ +\end{longtable} +} + +\section{延伸阅读} + +\begin{itemize} +\tightlist +\item + \href{https://arxiv.org/abs/2001.08361}{Scaling Laws for Neural Language Models} +\item + \href{https://en.wikipedia.org/wiki/Universal_approximation_theorem}{Universal Approximation Theorem} +\item + \href{https://www.nature.com/articles/s41586-023-06221-x}{The Evolution of AI: A Historical Perspective} +\item + \href{https://arxiv.org/pdf/2308.11432v2}{AI Agent 综述论文} +\end{itemize} diff --git a/chapters/ch02-framework.tex b/chapters/ch02-framework.tex new file mode 100644 index 0000000..13bc383 --- /dev/null +++ b/chapters/ch02-framework.tex @@ -0,0 +1,1135 @@ +\chapter{设计人工智能的理论框架} + +本章建立全书的核心理论框架。我们从''函数描述世界''的理念出发,引入数据模态(Data Modality)作为理解AI技术的组织原则,梳理从小模型到大模型的统一演进规律,并以多层感知机(MLP)作为一切深度学习的基础模型进行系统讲解。 + +\section{篇章导读} + +理解AI不需要逐一学习每种技术。核心理念是:\textbf{所有AI技术都是围绕不同类型的数据(模态)来学习函数}。 + +无论是处理文本、图像还是三维空间数据,AI的本质工作都是一样的——从数据中学习映射函数 \(y = f(x; \theta)\)。区别仅在于输入数据的形态不同,因此需要不同的网络结构来高效处理。 + +本章将: - 从函数式视角理解AI的本质 - 建立基于数据模态的全书知识地图 - 揭示所有AI技术背后的统一演进规律 - 深入讲解MLP这一最基础的神经网络 - 建立''环境-智能体-任务''实践框架,降低上手门槛 + + +\section{函数式AI视角} + +\subsection{学习目标} + +\begin{itemize} +\tightlist +\item + 理解''Functions Describe the World''的核心理念 +\item + 掌握从Excel线性回归到神经网络的演进逻辑 +\item + 理解数据驱动与规则驱动的根本区别 +\end{itemize} + +\subsection{物理定律:用函数描述世界} + +物理学是最早用数学函数描述世界的学科。人类科学家花费数百年时间,发现了许多简洁而优美的函数关系: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +现象 & 函数 & 发现者 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +自由落体 & \(h = \frac{1}{2}gt^2\) & 伽利略 \\ +万有引力 & \(F = \frac{Gm_1m_2}{r^2}\) & 牛顿 \\ +电磁感应 & \(\varepsilon = -\frac{d\Phi}{dt}\) & 法拉第 \\ +质能等价 & \(E = mc^2\) & 爱因斯坦 \\ +\end{longtable} +} + +这些函数的共同特点是:\textbf{用简洁的数学关系描述复杂的自然规律}。科学家通过观察现象、收集数据、提出假设,最终找到精确的函数形式。 + +\subsection{AI的函数观:从数据中学习函数} + +AI延续了这一传统,但方式截然不同——\textbf{不是由人类发现函数,而是让机器从数据中自动学习函数}。 + +\begin{lstlisting} +传统科学: 观察 → 假设 → 验证 → 发现函数 f(x) +AI方法: 数据 → 训练 → 学习函数 y = f(x; θ) +\end{lstlisting} + +在AI中,函数的一般形式为: + +\[y = f(x; \theta)\] + +其中: - \(x\) 是\textbf{输入}(如图像、文本、传感器数据) - \(y\) 是\textbf{输出}(如分类标签、预测值、生成内容) - \(\theta\) 是\textbf{可学习参数}(通过训练自动确定) - \(f\) 是\textbf{模型结构}(我们设计的函数框架) + +关键区别在于:物理定律中的函数形式是人为确定的(如 \(F=ma\)),而AI中的函数形式由神经网络自动学习,参数 \(\theta\) 通过海量数据训练得到。 + +\subsection{从Excel线性回归到神经网络} + +这个过程可以用一个渐进的例子来理解。 + +\textbf{第一步:简单线性回归(Excel就能做)} + +预测房价,只有一个输入变量——面积: + +\[房价 \approx 0.015 \times 面积 + 50万\] + +这就是 \(y = ax + b\),最简单的线性函数。在Excel中,我们可以用趋势线功能轻松完成。 + +\textbf{第二步:多元回归} + +增加更多特征: + +\[房价 \approx 0.01 \times 面积 + 0.5 \times 卧室数 + 0.3 \times 地段评分 - 20万\] + +这就是 \(y = a_1x_1 + a_2x_2 + a_3x_3 + b\)。从数学上看,这已经是\textbf{单个神经元}的完整形式。 + +\textbf{第三步:多层函数组合} + +现实世界的关系往往不是简单的线性关系。我们需要将多个函数组合起来: + +\begin{lstlisting} +h₁ = σ(W₁x + b₁) # 第一层:提取基础特征 +h₂ = σ(W₂h₁ + b₂) # 第二层:组合高级特征 +y = σ(W₃h₂ + b₃) # 第三层:输出最终结果 +\end{lstlisting} + +这就是\textbf{多层神经网络}。每一层都在做线性变换加非线性激活,层层嵌套形成复杂的能力。 + +\textbf{Python代码示例:简单线性回归} + +\begin{lstlisting}[language=Python] +import numpy as np +import matplotlib.pyplot as plt + +# 生成模拟数据:面积(平方米)与房价(万元) +np.random.seed(42) +areas = np.random.uniform(50, 200, 100) # 50-200平方米 +prices = 0.015 * areas + 50 + np.random.normal(0, 10, 100) # 加入噪声 + +# 使用最小二乘法拟合线性函数 y = ax + b +X = np.column_stack([areas, np.ones_like(areas)]) # 构造设计矩阵 +theta = np.linalg.lstsq(X, prices, rcond=None)[0] # 求解参数 + +a, b = theta +print(f"学到的函数: 房价 = {a:.4f} × 面积 + {b:.2f}") +print(f"真实函数: 房价 = 0.0150 × 面积 + 50.00") + +# 可视化 +plt.figure(figsize=(8, 5)) +plt.scatter(areas, prices, alpha=0.5, label='数据点') +plt.plot(areas, a * areas + b, 'r-', linewidth=2, label=f'拟合: y={a:.4f}x+{b:.1f}') +plt.xlabel('面积(平方米)') +plt.ylabel('房价(万元)') +plt.title('线性回归:从数据中学习函数') +plt.legend() +plt.grid(True, alpha=0.3) +plt.show() +\end{lstlisting} + +这段代码展示了一个完整的''从数据中学习函数''的过程。虽然这只是最简单的线性回归,但它已经包含了AI的核心思想:\textbf{给定数据,自动确定函数参数}。 + +\subsection{数据驱动 vs 规则驱动} + +这是理解AI最重要的思维转变。 + +\textbf{规则驱动(传统编程)} + +\begin{lstlisting}[language=Python] +# 传统方式:人工编写判断规则 +def classify_design_style(image): + if has_minimal_lines(image) and is_monochrome(image): + return "极简主义" + elif has_curved_forms(image) and is_colorful(image): + return "波普风格" + # ... 需要穷举所有情况 + return "未知风格" +\end{lstlisting} + +问题: - 规则难以穷举所有情况 - 边界情况(edge case)无法覆盖 - 无法处理模糊和不确定的情况 - 维护成本随复杂度指数增长 + +\textbf{数据驱动(AI方法)} + +\begin{lstlisting}[language=Python] +# AI方式:从标注数据中自动学习 +model = NeuralNetwork() +model.train(thousands_of_labeled_images) # 从数据中学习规律 +result = model.predict(new_image) # 自动判断 +\end{lstlisting} + +优势: - 自动发现人类难以表达的规律 - 数据越多,性能越好 - 可以处理复杂的、非线性的关系 - 适应性强,可迁移到新任务 + +\begin{quote} +\textbf{设计思维的转变}:从''设计规则''到''设计数据''。在AI时代,设计师不仅要设计规则(设计语言、规范),还要设计和管理训练数据,因为数据决定了AI学到的函数。 +\end{quote} + + +\section{数据模态全景} + +\subsection{学习目标} + +\begin{itemize} +\tightlist +\item + 理解数据模态(Data Modality)的概念 +\item + 建立全书各章节之间的知识地图 +\item + 理解为什么数据模态是组织AI知识的有效框架 +\end{itemize} + +\subsection{什么是数据模态} + +\textbf{模态(Modality)} 是指信息的存在形式和感知方式。人类通过不同感官感知不同模态的信息:耳朵感知声音(一维时间序列),眼睛感知图像(二维像素矩阵),身体感知空间(三维坐标)。 + +AI同样需要针对不同模态的数据采用不同的处理方式。一种数据模态决定了: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + \textbf{数据的组织形式}:文本是符号序列,图像是像素矩阵,三维数据是点云或网格 +\item + \textbf{适合的网络结构}:序列数据用RNN/Transformer,图像用CNN/ViT,空间数据用PointNet +\item + \textbf{典型的应用场景}:翻译、分类、检测、生成等 +\item + \textbf{评估标准}:不同任务的评估指标不同 +\end{enumerate} + +因此,\textbf{数据模态是理解AI技术最自然的组织框架}。 + +\subsection{六大数据模态} + +本书后续章节将围绕以下六大数据模态展开: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.0857}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1286}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1286}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1286}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.2714}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1286}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1286}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +模态 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +数据维度 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +数据类型 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +输入形式 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +代表模型(小→大) +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +设计应用 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +对应章节 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +\textbf{一维:文本与序列} & 1D & 文本、时间序列、音乐 & Token序列 & RNN → LSTM → BERT → GPT-4 & 设计文本生成、用户评论分析、设计趋势预测 & 第3章 \\ +\textbf{二维:图像与视觉} & 2D & 图像、视觉设计稿 & 像素矩阵 & LeNet → ResNet → ViT → SAM & 图像分类、目标检测、风格迁移、设计评估 & 第4章 \\ +\textbf{三维:空间与几何} & 3D & 点云、网格、体素 & 3D坐标集 & PointNet → DGCNN → Point Transformer & 三维重建、空间分析、建筑设计、数字孪生 & 第5章 \\ +\textbf{决策序列} & 时序决策 & 状态-动作对 & 状态→动作映射 & Q-Learning → DQN → PPO → AlphaGo & 布局优化、参数调优、自适应设计 & 第6章 \\ +\textbf{生成} & 创造性输出 & 图像、文本、音频 & 噪声/条件 & VAE → GAN → Diffusion → Sora & AIGC设计、概念生成、风格迁移、设计探索 & 第7章 \\ +\textbf{行动序列} & 多步行动 & 任务-工具-行动链 & 目标→计划→执行 & ReAct → Toolformer → AutoGPT → GPT-4V & 智能设计助手、自动化工作流、多Agent协作 & 第8章 \\ +\end{longtable} +} + +\subsection{模态之间的关系} + +这六种模态并非孤立存在,它们之间存在密切的内在联系: + +\begin{lstlisting} + ┌──────────────┐ + │ 一维:序列 │ + │ (第3章) │ + └──────┬───────┘ + │ 序列化的基础 + ┌──────┴───────┐ + │ 二维:视觉 │ + │ (第4章) │ + └──────┬───────┘ + │ 空间维度的扩展 + ┌──────┴───────┐ + │ 三维:空间 │ + │ (第5章) │ + └──────┬───────┘ + │ + ┌────────────┼────────────┐ + │ │ │ + ┌──────┴──────┐ ┌──┴───┐ ┌──────┴──────┐ + │ 决策序列 │ │ 生成 │ │ 行动序列 │ + │ (第6章) │ │(第7章)│ │ (第8章) │ + └─────────────┘ └──────┘ └─────────────┘ +\end{lstlisting} + +\textbf{从感知到行动的逻辑链条}: - \textbf{一维到三维}是感知智能的递进——从理解语言、识别图像到感知空间 - \textbf{决策序列}将感知转化为行动策略——在环境中做出最优选择 - \textbf{生成}突破感知的局限——不仅理解,还能创造新内容 - \textbf{行动序列}整合所有能力——感知、规划、执行形成闭环 + +\subsection{为什么模态是有用的组织原则} + +\textbf{第一,降低学习门槛。} 不需要一次性理解所有AI技术,只需要按数据类型逐一学习。理解了文本处理的方法后,很多概念可以直接迁移到图像处理。 + +\textbf{第二,揭示统一规律。} 虽然不同模态使用的网络结构不同,但背后遵循相同的学习范式——都是从小模型到大模型的演进(见2.3节)。 + +\textbf{第三,对应设计实践。} 设计师日常接触的信息天然是按模态划分的:文字(设计说明)、图像(效果图)、三维模型(空间设计)。按模态组织知识,便于直接找到所需技术。 + +\textbf{第四,预见技术趋势。} 理解了模态框架,就能更好地理解多模态(Multimodal)AI的发展方向——让AI同时处理多种模态的数据,正如人类同时用视觉、听觉和触觉感知世界。 + + +\section{小模型到大模型的演进规律} + +\subsection{学习目标} + +\begin{itemize} +\tightlist +\item + 理解AI技术发展的四个阶段 +\item + 认识到不同模态背后存在统一的演进规律 +\item + 建立对当前大模型时代的技术定位 +\end{itemize} + +\subsection{四个发展阶段} + +纵观AI各个模态的发展历程,可以提炼出一个统一的四阶段演进模式: + +\textbf{第一阶段:手工特征时代(Hand-crafted Features)} + +人类专家根据领域知识,手工设计特征提取方法。例如,图像处理中的边缘检测算子(Sobel、Canny)、纹理特征(HOG、SIFT),自然语言处理中的词袋模型(Bag of Words)、TF-IDF等。 + +特点: - 特征由人类专家精心设计 - 每个特征都有明确的物理含义 - 性能受限于人类的领域知识和表达能力 - 适合数据量小、计算资源有限的场景 + +\textbf{第二阶段:自动学习时代(Deep Learning)} + +深度学习让模型自动从原始数据中学习特征。卷积神经网络(CNN)自动学习图像特征,循环神经网络(RNN)自动学习序列特征。 + +特点: - 特征由网络自动学习,无需人工设计 - 端到端(End-to-End)的训练方式 - 需要大量标注数据 - 性能大幅超越手工特征方法 + +\textbf{第三阶段:预训练时代(Pre-training)} + +通过在大规模无标注数据上的预训练,模型学习通用知识,再通过微调(Fine-tuning)适配具体任务。迁移学习使得少量标注数据也能获得优秀性能。 + +特点: - 先预训练学通用知识,再微调适配任务 - 大幅减少对标注数据的依赖 - 模型开始具备迁移和泛化能力 - ``预训练+微调''成为标准范式 + +\textbf{第四阶段:大模型时代(Foundation Models)} + +参数规模达到十亿甚至万亿级别的模型,展现出''涌现能力''(Emergent Abilities)——模型规模大到一定程度后,突然具备了小模型没有的新能力。 + +特点: - 单一模型处理多种任务(通用性) - 涌现能力:规模带来质变 - 少样本甚至零样本学习 - Scaling Law:性能随规模持续提升 + +\subsection{四阶段对比} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1154}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2308}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2308}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2115}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2115}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +维度 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +手工特征时代 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +自动学习时代 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +预训练时代 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +大模型时代 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +\textbf{特征提取方式} & 人工设计 & 自动学习 & 预训练+微调 & 涌现学习 \\ +\textbf{数据需求} & 少量标注数据 & 大量标注数据 & 大量无标注+少量标注 & 海量多模态数据 \\ +\textbf{计算资源} & CPU即可 & 需要GPU & 需要多GPU & 需要大规模集群 \\ +\textbf{模型特点} & 任务专用 & 任务专用但自动 & 可迁移 & 通用基础模型 \\ +\textbf{典型模型} & SIFT、HOG、TF-IDF & AlexNet、LSTM & BERT、ResNet & GPT-4、SAM、Sora \\ +\textbf{设计影响} & 基础图像处理 & 自动化设计分析 & 设计知识迁移 & 通用设计智能 \\ +\end{longtable} +} + +\subsection{不同模态的演进路径} + +每种模态都经历了相同的四个阶段,只是时间线略有不同: + +\textbf{文本与序列(一维)} + +\begin{lstlisting} +手工特征 自动学习 预训练 大模型 +TF-IDF → Word2Vec → BERT (2018) → GPT-4 (2023) +词袋模型 LSTM/GRU ELMo Claude +N-gram Seq2Seq T5 Llama +\end{lstlisting} + +\textbf{图像与视觉(二维)} + +\begin{lstlisting} +手工特征 自动学习 预训练 大模型 +SIFT → AlexNet → ResNet → SAM (2023) +HOG VGGNet EfficientNet DINOv2 +Canny边缘 YOLO CLIP GPT-4V +\end{lstlisting} + +\textbf{三维空间(三维)} + +\begin{lstlisting} +手工特征 自动学习 预训练 大模型 +FPFH → PointNet → Point-BERT → Point-E +3D形状上下文 DGCNN Point-MAE Shape-E +体素特征 PointNet++ ULIP LRM +\end{lstlisting} + +\textbf{生成模型} + +\begin{lstlisting} +手工特征 自动学习 预训练 大模型 +规则模板 → VAE/GAN → StyleGAN → Stable Diffusion +马尔可夫链 PixelCNN BigGAN DALL-E 3 +分形算法 CycleGAN Craiyon Sora +\end{lstlisting} + +\begin{quote} +\textbf{关键洞察}:无论哪种模态,发展路径都遵循相同的规律——从人工设计到自动学习,从专用到通用,从小规模到大规模。理解了这个规律,即使面对全新的AI技术,也能快速定位它所处的阶段和意义。 +\end{quote} + +\subsection{对设计师的启示} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \textbf{不要被具体模型名称迷惑}。模型千变万化,但底层逻辑相同。重要的是理解它属于哪个阶段、处理什么模态的数据。 +\item + \textbf{关注趋势而非细节}。AI技术迭代极快,具体的模型可能很快过时,但从手工到自动、从小到大的趋势不会改变。 +\item + \textbf{预训练时代是设计师的最佳入口}。利用预训练模型,设计师不需要海量数据和强大算力,就能将AI应用到设计实践中。 +\item + \textbf{大模型时代带来''民主化''}。大模型通过自然语言交互降低了AI的使用门槛,设计师可以用自然语言指挥AI完成设计任务。 +\end{enumerate} + + +\section{MLP:一切的基础} + +\subsection{学习目标} + +\begin{itemize} +\tightlist +\item + 理解多层感知机(MLP)的网络架构 +\item + 掌握前向传播的计算过程 +\item + 了解激活函数、损失函数和反向传播的基本原理 +\item + 建立对神经网络训练过程的完整认知 +\end{itemize} + +\subsection{为什么MLP如此重要} + +多层感知机(Multi-Layer Perceptron, MLP)是最基础的神经网络结构。虽然现代AI使用CNN、Transformer等更复杂的架构,但它们的底层构件仍然是MLP中的基本操作:线性变换、非线性激活、损失计算和梯度更新。 + +\textbf{理解MLP是理解所有深度学习的起点。} + +\begin{lstlisting} +MLP(多层感知机) + │ + ├── CNN(卷积神经网络)= 局部连接的MLP + 权重共享 + │ + ├── RNN(循环神经网络)= 共享参数的MLP + 时间展开 + │ + └── Transformer = 注意力机制 + MLP +\end{lstlisting} + +\subsection{网络架构} + +MLP由三种类型的层组成: + +\begin{lstlisting} +输入层 隐藏层1 隐藏层2 输出层 +┌─────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────┐ +│ x₁ │ │ h₁ │ │ g₁ │ │ y₁ │ +│ x₂ │───→│ h₂ │──→│ g₂ │──→│ y₂ │ +│ x₃ │ │ h₃ │ │ g₃ │ │ y₃ │ +│ ... │ │ ... │ │ ... │ │ ... │ +│ xₙ │ │ hₘ │ │ gₖ │ │ yₚ │ +└─────────┘ └─────────────┘ └─────────────┘ └─────────┘ + │ │ │ │ + └───────────────┴─────────────────┴────────────────┘ + 全连接(Fully Connected):每个神经元与上一层所有神经元相连 +\end{lstlisting} + +各层的作用: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3200}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2400}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4400}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +层类型 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +作用 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +神经元数量 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +输入层 & 接收原始数据,每个神经元对应一个特征 & 取决于数据特征数(如图像像素数) \\ +隐藏层 & 特征变换与组合,逐步提取高级特征 & 可自由设计(超参数) \\ +输出层 & 产生最终预测结果 & 取决于任务(分类数或回归值数) \\ +\end{longtable} +} + +\textbf{设计类比}:可以把MLP想象为设计方案的评审流程。输入层是原始需求,隐藏层是不同维度的评估(功能、美学、可行性),输出层是最终的评分或决策。每一层都在对信息进行加工和抽象。 + +\subsection{前向传播} + +前向传播(Forward Propagation)是数据从输入层经过各隐藏层到达输出层的计算过程。 + +\textbf{单个神经元的计算} + +每个神经元执行两个操作: + +\begin{lstlisting} +步骤1:线性变换 z = W₁x₁ + W₂x₂ + ... + Wₙxₙ + b = Wx + b +步骤2:非线性激活 h = σ(z) +\end{lstlisting} + +其中 \(W\) 是权重(Weight),\(b\) 是偏置(Bias),\(\sigma\) 是激活函数(Activation Function)。 + +\textbf{完整网络的前向传播} + +对于L层网络,前向传播逐层计算: + +\begin{lstlisting} +# 第1层 +h₁ = σ₁(W₁ · x + b₁) + +# 第2层 +h₂ = σ₂(W₂ · h₁ + b₂) + +# ... 第l层 +hₗ = σₗ(Wₗ · hₗ₋₁ + bₗ) + +# 输出层 +y = hₗ +\end{lstlisting} + +用更简洁的函数组合表示: + +\[y = f_L(f_{L-1}(\cdots f_2(f_1(x))\cdots))\] + +\textbf{数据流动示意} + +\begin{lstlisting} +输入向量 x + │ + ├─→ 线性变换: z₁ = W₁x + b₁ + │ │ + │ └─→ 激活函数: h₁ = σ(z₁) + │ │ + │ └─→ 线性变换: z₂ = W₂h₁ + b₂ + │ │ + │ └─→ 激活函数: h₂ = σ(z₂) + │ │ + │ └─→ ... → y(输出) +\end{lstlisting} + +\textbf{Python代码示例:手动实现前向传播} + +\begin{lstlisting}[language=Python] +import numpy as np + +def sigmoid(x): + """Sigmoid激活函数""" + return 1 / (1 + np.exp(-x)) + +def relu(x): + """ReLU激活函数""" + return np.maximum(0, x) + +# 定义一个简单的3层MLP +# 输入: 4维 → 隐藏层1: 8个神经元 → 隐藏层2: 4个神经元 → 输出: 2维 + +# 初始化权重和偏置(实际中由训练得到) +W1 = np.random.randn(8, 4) * 0.01 # (8, 4) +b1 = np.zeros((8, 1)) # (8, 1) +W2 = np.random.randn(4, 8) * 0.01 # (4, 8) +b2 = np.zeros((4, 1)) # (4, 1) +W3 = np.random.randn(2, 4) * 0.01 # (2, 4) +b3 = np.zeros((2, 1)) # (2, 1) + +# 输入数据(4个特征) +x = np.array([[0.5], [0.3], [0.8], [0.1]]) # (4, 1) + +# 前向传播 +z1 = np.dot(W1, x) + b1 # 线性变换 +h1 = relu(z1) # ReLU激活 +z2 = np.dot(W2, h1) + b2 # 线性变换 +h2 = relu(z2) # ReLU激活 +z3 = np.dot(W3, h2) + b3 # 线性变换 +y = sigmoid(z3) # Sigmoid激活(输出层) + +print(f"输入: {x.flatten()}") +print(f"隐藏层1输出: {h1.flatten()}") +print(f"隐藏层2输出: {h2.flatten()}") +print(f"最终输出: {y.flatten()}") +\end{lstlisting} + +\subsection{激活函数} + +激活函数(Activation Function)是神经网络的''灵魂''。没有激活函数,无论网络有多少层,都等价于一个单层线性变换: + +\[y = W_2(W_1x) = (W_2W_1)x = W'x\] + +激活函数引入\textbf{非线性},使网络能够拟合任意复杂的函数关系。 + +\textbf{常用激活函数对比} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2308}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1538}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2308}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1538}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2308}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +激活函数 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +公式 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +输出范围 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +典型应用 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Sigmoid & \(\sigma(z) = \frac{1}{1+e^{-z}}\) & (0, 1) & 输出可解释为概率;两端梯度消失 & 二分类输出层 \\ +ReLU & \(\text{ReLU}(z) = \max(0, z)\) & {[}0, +∞) & 计算简单高效;缓解梯度消失 & \textbf{隐藏层首选} \\ +Tanh & \(\tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}\) & (-1, 1) & 零中心化;两端梯度消失 & 循环网络隐藏层 \\ +Softmax & \(\text{softmax}(z_i) = \frac{e^{z_i}}{\sum_j e^{z_j}}\) & (0, 1),和为1 & 输出为概率分布 & 多分类输出层 \\ +LeakyReLU & \(\text{LeakyReLU}(z) = \max(\alpha z, z)\) & (-∞, +∞) & 解决ReLU''死神经元''问题 & 深层网络隐藏层 \\ +\end{longtable} +} + +\textbf{视觉对比} + +\begin{lstlisting} +ReLU: Sigmoid: Tanh: + ↑ ___ ___ + │ / \ / \ + │ / \ / \ + │ ____ / \ ____ / \ ____ + │___________| │ │ │ │ + └───────────┼──→ └──────────┘ └────────────────────┘ + -∞ 0 +∞ -∞ 0 +∞ -∞ 0 +∞ + +特点:简单,计算快 特点:平滑,输出(0,1) 特点:零中心,输出(-1,1) +正区间梯度恒为1 两端梯度趋近于0 两端梯度趋近于0 +负区间输出为0 可能导致梯度消失 可能导致梯度消失 +\end{lstlisting} + +\begin{quote} +\textbf{设计类比}:激活函数就像是设计中的''非线性思维''。如果只有线性思维(没有激活函数),无论思考多少层,结论都是线性的——就像在一条直线上来回走。激活函数引入了''跳跃''和''拐弯''的能力,让网络能够表达复杂的设计关系。 +\end{quote} + +\subsection{损失函数} + +损失函数(Loss Function)衡量模型预测值与真实值之间的差距,是训练过程的''指南针''。 + +\textbf{常用损失函数} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2727}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2727}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1818}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2727}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +任务类型 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +损失函数 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +公式 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +直观含义 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +回归 & 均方误差 (MSE) & \(L = \frac{1}{n}\sum_{i=1}^{n}(\hat{y}_i - y_i)^2\) & 预测值与真实值差的平方平均 \\ +二分类 & 二元交叉熵 (BCE) & \(L = -[y\log\hat{y} + (1-y)\log(1-\hat{y})]\) & 预测概率与真实标签的偏差 \\ +多分类 & 交叉熵 (CE) & \(L = -\sum_{i=1}^{C}y_i\log\hat{y}_i\) & 预测分布与真实分布的差距 \\ +\end{longtable} +} + +其中 \(\hat{y}\) 是模型预测值,\(y\) 是真实值。 + +\textbf{损失函数的直观理解} + +\begin{lstlisting} +好的预测: 差的预测: +预测值: ■ 预测值: ■ +真实值: ■ 真实值: ■ +损失小: | 损失大: |——---| +→ 参数调整小 → 参数需要大幅调整 +\end{lstlisting} + +\subsection{反向传播与梯度下降} + +反向传播(Backpropagation)是训练神经网络的核心算法,它解决了''如何高效计算每个参数对损失的影响程度''这一问题。 + +\textbf{核心思想:梯度下降} + +训练目标是最小化损失函数。梯度下降的思想是:沿着损失函数梯度(下降最快的方向)的相反方向更新参数。 + +\[\theta = \theta - \alpha \nabla L(\theta)\] + +其中: - \(\theta\):模型的所有可学习参数(权重 \(W\) 和偏置 \(b\)) - \(\alpha\):学习率(Learning Rate),控制每次更新的步长 - \(\nabla L(\theta)\):损失函数对参数的梯度 + +\textbf{直观理解} + +想象你站在山上某处(当前参数值),目标是到达谷底(最小损失)。梯度下降就是: - 观察脚下地面的坡度(计算梯度) - 沿着最陡的下坡方向走一步(参数更新) - 重复以上步骤直到到达谷底(收敛) + +\begin{lstlisting} +损失 L + │ ╲ + │ ╲ ╱╲ + │ ╲╱ ╲ ← 梯度下降的路径 + │ ╲ ╲ ╱ + │ ╲ ╲╱ + │ ╲ + └───────────────→ 参数 θ +\end{lstlisting} + +\textbf{反向传播:高效计算梯度} + +反向传播利用\textbf{链式法则(Chain Rule)},从输出层向输入层反向逐层计算梯度: + +\begin{lstlisting} +前向传播(计算输出): + x → h₁ → h₂ → ... → y → L(损失) + +反向传播(计算梯度): + ∂L/∂y → ∂L/∂h₂ → ∂L/∂h₁ → ∂L/∂x(每步用链式法则) +\end{lstlisting} + +链式法则的具体形式: + +\[\frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial h_2} \cdot \frac{\partial h_2}{\partial h_1} \cdot \frac{\partial h_1}{\partial W_1}\] + +\textbf{训练循环的四个步骤} + +\begin{lstlisting} +1. 前向传播:用当前参数计算预测值 y = f(x; θ) +2. 计算损失:比较预测值与真实值 L = loss(y, ŷ) +3. 反向传播:计算损失对所有参数的梯度 ∂L/∂θ +4. 参数更新:沿梯度反方向更新参数 θ = θ - α·∂L/∂θ + +重复以上步骤,直到损失不再显著下降(收敛) +\end{lstlisting} + +\textbf{Python代码示例:完整的训练循环} + +\begin{lstlisting}[language=Python] +import numpy as np + +# ===== 1. 准备数据 ===== +# 模拟数据:用y = 2x₁ + 3x₂ + 1生成 +np.random.seed(42) +X = np.random.randn(100, 2) # 100个样本,2个特征 +y_true = 2 * X[:, 0:1] + 3 * X[:, 1:2] + 1 # 真实值 +y_true += np.random.normal(0, 0.1, y_true.shape) # 加入噪声 + +# ===== 2. 初始化参数 ===== +W = np.random.randn(2, 1) * 0.01 # 权重 (2, 1) +b = np.zeros((1, 1)) # 偏置 (1, 1) +learning_rate = 0.01 # 学习率 + +# ===== 3. 训练循环 ===== +for epoch in range(500): + # 前向传播 + y_pred = np.dot(X, W) + b # 线性变换: z = Wx + b + + # 计算损失(均方误差) + loss = np.mean((y_pred - y_true) ** 2) + + # 反向传播(计算梯度) + dL_dy = 2 * (y_pred - y_true) / len(X) # 损失对输出的梯度 + dL_dW = np.dot(X.T, dL_dy) # 损失对W的梯度 + dL_db = np.sum(dL_dy, axis=0, keepdims=True) # 损失对b的梯度 + + # 参数更新(梯度下降) + W = W - learning_rate * dL_dW + b = b - learning_rate * dL_db + + # 每100轮打印一次 + if (epoch + 1) % 100 == 0: + print(f"第 {epoch+1:3d} 轮 | 损失: {loss:.6f} " + f"| W: [{W[0,0]:.4f}, {W[1,0]:.4f}] | b: {b[0,0]:.4f}") + +print(f"\n学到的参数: W = {W.flatten()}, b = {b.flatten()}") +print(f"真实参数: W = [2.0, 3.0], b = [1.0]") +\end{lstlisting} + +输出示例: + +\begin{lstlisting} +第 100 轮 | 损失: 0.352148 | W: [1.5234, 2.3456] | b: 0.8765 +第 200 轮 | 损失: 0.053421 | W: [1.8765, 2.8234] | b: 0.9654 +第 300 轮 | 损失: 0.008756 | W: [1.9654, 2.9567] | b: 0.9932 +第 400 轮 | 损失: 0.001543 | W: [1.9923, 2.9891] | b: 0.9987 +第 500 轮 | 损失: 0.000287 | W: [1.9985, 2.9978] | b: 0.9997 + +学到的参数: W = [1.9985, 2.9978], b = [0.9997] +真实参数: W = [2.0, 3.0], b = [1.0] +\end{lstlisting} + +可以看到,经过500轮训练,模型学到的参数已经非常接近真实值。 + +\subsection{MLP的局限性} + +虽然MLP是理解神经网络的基础,但它也存在明显的局限性: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + \textbf{参数量爆炸}:处理高维输入(如高清图像)时,全连接导致参数量过大 +\item + \textbf{忽略数据结构}:将图像展平成一维向量会丢失空间结构信息 +\item + \textbf{缺乏平移不变性}:物体在图像中移动后,需要重新学习 +\item + \textbf{难以处理序列数据}:没有处理时序依赖的机制 +\end{enumerate} + +正是这些局限性,催生了后续的CNN(处理图像)、RNN(处理序列)、Transformer(处理通用序列)等更专业的架构。但它们的底层原理都与MLP一脉相承。 + + +\section{环境-智能体-任务:AI实践的三元框架} + +\subsection{学习目标} + +\begin{itemize} +\tightlist +\item + 理解''环境-智能体-任务''三元框架 +\item + 认识环境配置是AI实践中的关键瓶颈 +\item + 掌握降低环境门槛的实用策略 +\item + 了解推荐的学习资源与平台 +\end{itemize} + +\subsection{三元框架的提出} + +学习AI技术可以抽象为一个三元交互模型:\textbf{环境(Environment)--- 智能体(Agent)--- 任务(Task)}。 + +\begin{lstlisting} +┌──────────────────────────────────────────────────┐ +│ │ +│ ┌──────────┐ 执行任务 ┌──────────┐ │ +│ │ 智能体 │ ──────────────→ │ 任务 │ │ +│ │ (Agent) │ ←────────────── │ (Task) │ │ +│ │ │ 返回结果 │ │ │ +│ └────┬─────┘ └──────────┘ │ +│ │ 感知 │ │ +│ ▼ │ │ +│ ┌──────────┐ │ │ +│ │ 环境 │ ◄───────────────────┘ │ +│ │(Environ.)│ 环境反馈 │ +│ └──────────┘ │ +│ │ +└──────────────────────────────────────────────────┘ +\end{lstlisting} + +三个要素的含义: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1935}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1935}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.6129}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +要素 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +含义 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +AI学习中的具体体现 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +\textbf{环境} & 智能体所处的操作空间 & Python环境、GPU资源、数据集、网络连接 \\ +\textbf{智能体} & 执行任务的学习者 & 设计专业学生、设计师、研究人员 \\ +\textbf{任务} & 需要完成的目标 & 运行一个CNN分类器、训练一个生成模型、部署一个Agent \\ +\end{longtable} +} + +这个框架不仅适用于强化学习中的智能体(见第6章),也适用于\textbf{人类学习AI的过程}:学习者(智能体)需要在一个合适的环境(计算环境)中完成学习任务。 + +\subsection{环境配置:被忽视的瓶颈} + +对于计算机专业的学生,搭建Python环境、安装PyTorch、下载预训练模型可能只是日常操作。但对于\textbf{设计专业学生}而言,环境配置往往成为学习AI的最大障碍: + +\begin{lstlisting} +设计学生尝试运行一个图像分类示例: + + 1. 安装Python → 版本冲突(3.8? 3.9? 3.11?) + 2. 安装pip包 → 权限报错 / 网络超时 + 3. pip install torch → 下载2GB,断线重连3次 + 4. 下载预训练权重 → 需要HuggingFace账号 / 网络限制 + 5. CUDA版本不匹配 → "torch.cuda.is_available() = False" + 6. import cv2报错 → 缺少系统依赖 + 7. 终于跑通 → 已经精疲力竭,失去了学习兴趣 +\end{lstlisting} + +\textbf{典型痛点清单}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +痛点 & 具体表现 & 严重程度 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Python版本管理 & 多版本共存导致路径混乱 & ★★★★ \\ +包依赖冲突 & numpy版本不兼容PyTorch & ★★★★ \\ +GPU/CUDA配置 & 驱动版本与CUDA版本不匹配 & ★★★★★ \\ +数据下载 & 大型数据集下载慢、需要代理 & ★★★★ \\ +网络环境 & HuggingFace/Google Colab访问受限 & ★★★★ \\ +系统差异 & Windows/Mac/Linux命令不同 & ★★★ \\ +内存不足 & 本地机器无法运行大模型 & ★★★★ \\ +\end{longtable} +} + +\begin{quote} +\textbf{核心观点}:环境问题不是''技术能力不足''的问题,而是\textbf{基础设施鸿沟}。正如设计师不需要理解CAD软件的底层渲染引擎才能画图,学习AI也不应该被环境配置阻挡在门外。 +\end{quote} + +\subsection{降低门槛的实践策略} + +针对以上痛点,推荐以下策略: + +\textbf{策略一:使用云端开发环境} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2222}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2222}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2222}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +平台 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +适用场景 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +费用 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Google Colab & 免费GPU、即开即用 & 快速实验、课程练习 & 免费/Pro版\$10/月 \\ +Kaggle Notebooks & 免费GPU、数据集内置 & 竞赛学习、数据分析 & 免费 \\ +阿里云天池 & 国内访问快、中文社区 & 国内课程、中文教程 & 免费额度 \\ +AutoDL / 矩池云 & 国内GPU租用 & 训练大模型、长时间训练 & 按量计费 \\ +\end{longtable} +} + +\textbf{策略二:使用Vibe Coding工具链} + +本书附录2详细介绍了Vibe Coding(感觉驱动编程)的理念和工具链。核心思想是:\textbf{让AI辅助编程,降低代码编写的门槛}。 + +\begin{itemize} +\tightlist +\item + \textbf{Claude Code}:用自然语言描述需求,AI自动生成代码 +\item + \textbf{Cursor / GitHub Copilot}:IDE内AI辅助编程 +\item + \textbf{Jupyter Notebook}:交互式编程,所见即所得 +\end{itemize} + +\textbf{策略三:使用容器化环境} + +\begin{lstlisting}[language=bash] +# 一行命令启动预配置的AI开发环境(需安装Docker) +docker run -it -p 8888:8888 pytorch/pytorch:latest + +# 或使用 conda 快速创建隔离环境 +conda create -n ai-design python=3.10 +conda activate ai-design +conda install pytorch torchvision -c pytorch +\end{lstlisting} + +容器化确保环境一致性——一次配置,到处运行。 + +\textbf{策略四:渐进式学习路径} + +\begin{lstlisting} +零门槛入门 进阶实践 深度开发 +───────────────────────────────────────────────────── +Google Colab → 本地Python环境 → GPU服务器 +自然语言编程 → Vibe Coding → 原生代码编写 +在线Notebook → Jupyter本地 → IDE (VSCode) +调用API → 加载预训练模型 → 微调训练 +小数据集实验 → 设计数据集构建 → 大规模训练 +\end{lstlisting} + +\begin{quote} +\textbf{建议}:初学阶段不必强求本地环境配置完整。先在云端环境跑通案例、建立直觉,再逐步搭建本地环境。 +\end{quote} + +\subsection{推荐学习资源} + +以下资源可以作为本章和后续章节的补充学习材料: + +\textbf{机器学习与深度学习系统课程} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +资源 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +链接 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Datawhale Bishop DL & 基于Bishop《深度学习》的中文笔记,覆盖概率论、回归、分类、DNN、CNN、Transformer & \href{https://datawhalechina.github.io/dive-into-bishop-dl/}{dive-into-bishop-dl} \\ +Ai-learn & 完整的AI学习路线图,从数学基础到深度学习实战 & \href{https://github.com/tangyudi/Ai-learn}{Ai-learn} \\ +3Blue1Brown 神经网络 & 顶级可视化讲解,建立直觉理解 & \href{https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi}{YouTube} \\ +李宏毅机器学习 & 中文讲解,理论与应用并重 & \href{https://www.youtube.com/c/HungyiLeeNTU}{YouTube} \\ +fast.ai & 顶向下教学,先实践后理论 & \href{https://course.fast.ai/}{course.fast.ai} \\ +d2l.ai(动手学深度学习) & 代码驱动,PyTorch/MXNet/TensorFlow多框架 & \href{https://d2l.ai/}{d2l.ai} \\ +\end{longtable} +} + +\textbf{设计领域AI资源} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}ll@{}} +\toprule\noalign{} +资源 & 说明 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Hugging Face & 模型和数据集的''GitHub'',可在线体验 \\ +Civitai & Stable Diffusion模型分享社区 \\ +Papers With Code & 论文+代码+排行榜,追踪最新技术 \\ +\end{longtable} +} + +\begin{quote} +\textbf{学习方法建议}:不要试图一次性学完所有资源。根据当前章节的学习进度,选择1-2个配套资源即可。例如,学习第3章(Transformer)时,可以对照 Datawhale Bishop DL 中对应的章节加深理解。 +\end{quote} + + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \textbf{函数思维练习}:请列举3个设计领域中的例子,说明它们可以用函数 \(y = f(x; \theta)\) 来描述。思考输入 \(x\)、输出 \(y\) 和需要学习的参数 \(\theta\) 分别是什么。 +\item + \textbf{模态映射练习}:选择一个你熟悉的设计项目(如建筑设计、产品设计或平面设计),分析该项目涉及哪些数据模态(一维/二维/三维/决策/生成/行动),以及每种模态在该项目中的作用。 +\item + \textbf{演进规律思考}:回顾2.3节中介绍的四个发展阶段。在你关注的设计领域,AI技术目前处于哪个阶段?未来会如何演进?请给出你的分析和理由。 +\item + \textbf{环境-智能体-任务练习}:规划你的AI学习路径。评估你当前的计算环境(笔记本配置、网络条件),选择最适合你的入门策略(云端/本地/Vibe Coding),并设定一个本周可完成的小任务(如在Colab上运行一个图像分类示例)。 +\end{enumerate} + + +\section{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +数据模态 & Data Modality & 信息的存在形式,如文本、图像、三维等 \\ +线性回归 & Linear Regression & \(y = ax + b\) 形式的函数拟合 \\ +多元回归 & Multiple Regression & 多输入变量的线性模型 \(y = \sum a_ix_i + b\) \\ +多层感知机 & Multi-Layer Perceptron (MLP) & 最基础的前馈神经网络结构 \\ +前向传播 & Forward Propagation & 数据从输入层到输出层的计算过程 \\ +激活函数 & Activation Function & 引入非线性的函数,如ReLU、Sigmoid \\ +损失函数 & Loss Function & 衡量预测值与真实值差距的函数 \\ +反向传播 & Backpropagation & 利用链式法则计算梯度的算法 \\ +梯度下降 & Gradient Descent & 沿梯度反方向更新参数的优化方法 \\ +学习率 & Learning Rate & 梯度下降中控制参数更新步长的超参数 \\ +权重 & Weight & 神经元之间连接的可学习参数 \\ +偏置 & Bias & 调整输出基准的可学习参数 \\ +特征工程 & Feature Engineering & 人工设计和提取数据特征的过程 \\ +迁移学习 & Transfer Learning & 将一个任务学到的知识迁移到新任务 \\ +基础模型 & Foundation Model & 在大规模数据上预训练的大型通用模型 \\ +涌现能力 & Emergent Abilities & 模型规模大到一定程度后出现的新能力 \\ +缩放定律 & Scaling Law & 模型性能与规模(数据量、参数量、计算量)之间的关系规律 \\ +环境-智能体-任务 & Environment-Agent-Task & AI实践的三元框架:环境提供操作空间,智能体执行任务,任务定义目标 \\ +Vibe Coding & Vibe Coding & 感觉驱动编程,用自然语言描述需求让AI生成代码的编程范式 \\ +全连接层 & Fully Connected Layer & 每个神经元与上一层所有神经元相连的网络层 \\ +预训练 & Pre-training & 在大规模数据上的初始训练阶段 \\ +微调 & Fine-tuning & 在特定任务数据上对预训练模型进行适配训练 \\ +\end{longtable} +} + + +\section{延伸阅读} + +\begin{itemize} +\tightlist +\item + \href{http://neuralnetworksanddeeplearning.com/}{Neural Networks and Deep Learning} --- Michael Nielsen 的在线教材,直观讲解神经网络原理 +\item + \href{https://arxiv.org/abs/2001.08361}{Scaling Laws for Neural Language Models} --- Kaplan et al., 2020,Scaling Law 的经典论文 +\item + \href{https://arxiv.org/abs/2108.07258}{On the Opportunities and Risks of Foundation Models} --- Stanford HAI 报告,全面介绍基础模型 +\item + \href{https://www.youtube.com/watch?v=aircAruvnKk}{3Blue1Brown: But what is a Neural Network?} --- 优秀的神经网络可视化讲解视频 +\end{itemize} diff --git a/chapters/ch03-1d-sequence.tex b/chapters/ch03-1d-sequence.tex new file mode 100644 index 0000000..4241113 --- /dev/null +++ b/chapters/ch03-1d-sequence.tex @@ -0,0 +1,1654 @@ +\chapter{一维数据——序列与文本} + +\section{篇章导读} + +一维数据(1D Data)是人工智能处理的最基础、也是最重要的数据形态。你正在阅读的文字、你说出的一句话、股票市场的价格走势、建筑室内温度随时间的变化——这些都是一维序列数据。 + +与图像(二维)和三维模型(三维)不同,一维数据的核心特征是\textbf{有序性}:每一个元素的含义不仅取决于它本身,还取决于它在序列中的位置以及与前后元素的关系。``我吃饭了''和''饭我吃了''虽然包含相同的字,但含义截然不同——这就是序列的魅力与挑战。 + +本章将带你踏上一段激动人心的技术演进之旅:从早期的小型循环神经网络(RNN),到注意力机制的革命性突破,再到 Transformer 架构的横空出世,最终见证大语言模型(LLM)如何改变整个 AI 格局。这条从小模型到大模型的技术脉络,不仅是深度学习最精彩的故事之一,也直接关系到今天每一位设计师如何使用 AI 工具。 + +\textbf{核心线索}:序列数据的模型演进——RNN(小模型)→ 注意力机制 → Transformer → 大语言模型(LLM) + + +\section{学习目标} + +\begin{itemize} +\tightlist +\item + 理解序列数据的特点与建模难点 +\item + 掌握 RNN、LSTM、GRU 的基本原理 +\item + 理解 Self-Attention 机制和 Transformer 架构 +\item + 了解大语言模型的发展历程与关键技术 +\item + 学会在设计场景中应用文本处理技术 +\end{itemize} + + +\section{序列建模} + +\section{为什么序列数据如此重要?} + +在设计领域,序列数据无处不在: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +数据类型 & 示例 & 设计场景 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +文本序列 & 设计说明、用户评论 & 需求分析、情感分析 \\ +时间序列 & 温度、人流量、能耗 & 环境监测、建筑性能 \\ +操作序列 & 用户点击、浏览路径 & 交互设计优化 \\ +空间序列 & 路径规划、动线分析 & 室内导航设计 \\ +\end{longtable} +} + +\subsection{序列数据的两大挑战} + +\textbf{挑战一:变长问题} + +图像的尺寸可以统一缩放,但文本的长度千变万化: + +\begin{lstlisting} +"好" → 长度 1 +"这个设计方案不错" → 长度 7 +"请将客厅的主色调调整为暖色系,并增加自然采光" → 长度 19 +\end{lstlisting} + +传统的全连接网络(MLP)要求固定大小的输入,无法直接处理变长序列。 + +\textbf{挑战二:时序依赖} + +序列中元素的含义依赖上下文: + +\begin{lstlisting} +"这个设计 很好" → 正面评价 +"这个设计 很好笑" → 负面/调侃评价 + +"光线 不足" → 设计问题 +"光线 充足" → 设计优点 +\end{lstlisting} + +模型需要''记住''之前看到的内容,才能理解当前内容。这正是\textbf{循环神经网络}要解决的核心问题。 + + +\section{RNN:循环神经网络} + +\subsection{核心思想} + +RNN(Recurrent Neural Network)通过\textbf{隐藏状态}(Hidden State)在时间步之间传递信息,实现''记忆''功能。 + +\begin{lstlisting} +时间展开视图: + + x₁ x₂ x₃ x₄ + │ │ │ │ + ▼ ▼ ▼ ▼ +┌───┐ ┌───┐ ┌───┐ ┌───┐ +│h₁ │──→│h₂ │──→│h₃ │──→│h₄ │ +└───┘ └───┘ └───┘ └───┘ + │ │ │ │ + ▼ ▼ ▼ ▼ + y₁ y₂ y₃ y₄ +\end{lstlisting} + +\subsection{数学表达} + +在每个时间步 t,RNN 执行以下计算: + +\begin{lstlisting} +隐藏状态更新: + h_t = tanh(W_hh · h_{t-1} + W_xh · x_t + b_h) + +输出计算: + y_t = W_hy · h_t + b_y +\end{lstlisting} + +其中: - \passthrough{\lstinline!x\_t!}:时刻 t 的输入 - \passthrough{\lstinline!h\_\{t-1\}!}:上一时刻的隐藏状态(``记忆'') - \passthrough{\lstinline!h\_t!}:当前时刻的隐藏状态 - \passthrough{\lstinline!W\_hh, W\_xh, W\_hy!}:可学习的权重矩阵 + +\subsection{直观理解} + +想象你在阅读一份设计说明书: + +\begin{lstlisting} +输入序列:"客厅 采用 开放式 布局 以 增加 空间感" + +时间步1:看到"客厅" → h₁ = "在讨论一个房间" +时间步2:看到"采用" → h₂ = "在讨论客厅的某个选择" +时间步3:看到"开放式" → h₃ = "客厅选择了开放式布局" +时间步4:看到"布局" → h₄ = "确认:客厅开放式布局方案" +时间步5:看到"以" → h₅ = "接下来要说目的" +时间步6:看到"增加" → h₆ = "目的是增加某个属性" +时间步7:看到"空间感" → h₇ = "完整理解:客厅用开放式布局来增加空间感" +\end{lstlisting} + +每一步,RNN 都在累积和更新对文本的理解。这就是''记忆''的力量。 + +\subsection{PyTorch 代码示例} + +\begin{lstlisting}[language=Python] +import torch +import torch.nn as nn + +# 定义一个简单的 RNN +class SimpleRNN(nn.Module): + def __init__(self, input_size, hidden_size, output_size): + super().__init__() + self.rnn = nn.RNN(input_size, hidden_size, batch_first=True) + self.fc = nn.Linear(hidden_size, output_size) + + def forward(self, x): + # x 形状: (batch, seq_len, input_size) + out, h_n = self.rnn(x) # out: 所有时间步的输出 + out = self.fc(out[:, -1, :]) # 取最后一个时间步 + return out + +# 创建模型 +model = SimpleRNN(input_size=100, hidden_size=64, output_size=2) +# 用于文本分类(如:正面/负面评价) +\end{lstlisting} + + +\section{RNN 的致命问题:梯度消失与梯度爆炸} + +\subsection{问题根源} + +RNN 需要通过反向传播跨越多个时间步来更新参数。当序列较长时,梯度要经过多次乘法运算: + +\begin{lstlisting} +梯度回传路径(以4步为例): + +∂L/∂W = (∂L/∂h₄) · (∂h₄/∂h₃) · (∂h₃/∂h₂) · (∂h₂/∂h₁) · (∂h₁/∂W) + └───────── 多次连乘 ──────────┘ +\end{lstlisting} + +\begin{itemize} +\tightlist +\item + 如果每步的梯度 \textless{} 1 → 连乘后趋近于 0 → \textbf{梯度消失}(学不到远距离依赖) +\item + 如果每步的梯度 \textgreater{} 1 → 连乘后趋近于 ∞ → \textbf{梯度爆炸}(训练不稳定) +\end{itemize} + +\subsection{直观类比} + +\begin{lstlisting} +传话游戏: + +第1个人:"把客厅漆成温暖的米黄色" +第2个人:"把客厅漆成温暖的米……什么?" ← 信息开始丢失 +第3个人:"客厅……漆成……?" ← 大量信息丢失 +第4个人:"什么客厅?" ← 几乎全忘了 + +RNN 处理长序列时遇到同样的问题! +\end{lstlisting} + +在实际应用中,标准 RNN 通常只能''记住''5-10步之前的信息。对于''这个设计方案虽然外观简洁大方,功能分区合理,但是整体造价偏高''这样跨越多个分句的评价,RNN 可能会遗忘前半部分的内容。 + + +\section{LSTM:长短期记忆网络} + +\subsection{设计哲学} + +LSTM(Long Short-Term Memory)由 Hochreiter 和 Schmidhuber 于1997年提出,核心创新是引入\textbf{细胞状态}(Cell State)——一条贯穿整个序列的''信息高速公路'',让信息可以长距离传递而不被稀释。 + +\begin{lstlisting} +LSTM 单元内部结构: + + ┌──────────────────────────────────────┐ + │ LSTM 单元 │ + │ │ + c_{t-1} ───────→ │ ─── 遗忘门 ──→ ── 输入门 ──→ ──────→ │ ──→ c_t + │ ↓ ↓ ↓ │ (细胞状态) + h_{t-1} ──┐ │ σ σ+σ̃ tanh │ + │ │ ↓ ↓ ↓ │ + x_t ──────┤ │ f_t i_t c̃_t │ + │ │ ↓ │ + │ │ c_t = f_t⊙c_{t-1} + i_t⊙c̃_t + │ │ ↓ │ + └─────→│ ────────────── 输出门 ──────→│ │ + │ σ → o_t ↓ │ + │ h_t = o_t ⊙ tanh(c_t) │ + └──────────────────────────────────────┘ +\end{lstlisting} + +\subsection{三道门:遗忘、输入、输出} + +LSTM 通过三个''门''(Gate)来精确控制信息的流动: + +\textbf{1. 遗忘门(Forget Gate)}:决定从细胞状态中丢弃什么信息 + +\begin{lstlisting} +f_t = σ(W_f · [h_{t-1}, x_t] + b_f) + +输出范围 (0, 1):0 = 全部遗忘,1 = 全部保留 +\end{lstlisting} + +\textbf{2. 输入门(Input Gate)}:决定将什么新信息存入细胞状态 + +\begin{lstlisting} +i_t = σ(W_i · [h_{t-1}, x_t] + b_i) # 哪些信息需要更新 +c̃_t = tanh(W_c · [h_{t-1}, x_t] + b_c) # 新的候选值 +\end{lstlisting} + +\textbf{3. 输出门(Output Gate)}:决定输出什么信息 + +\begin{lstlisting} +o_t = σ(W_o · [h_{t-1}, x_t] + b_o) +h_t = o_t ⊙ tanh(c_t) +\end{lstlisting} + +\subsection{细胞状态更新} + +\begin{lstlisting} +c_t = f_t ⊙ c_{t-1} + i_t ⊙ c̃_t + └────────┘ └────────┘ + 保留旧信息 加入新信息 +\end{lstlisting} + +\subsection{设计类比} + +\begin{lstlisting} +LSTM 就像一位优秀的设计项目管理者: + + 遗忘门 → "之前的方案中哪些思路已经过时了?" + 输入门 → "客户提出了什么新需求?" + 细胞状态 → "项目的核心理念和关键约束"(长期记忆) + 隐藏状态 → "当前正在讨论的具体话题"(短期记忆) + 输出门 → "现在应该向团队传达什么信息?" +\end{lstlisting} + +\subsection{代码示例} + +\begin{lstlisting}[language=Python] +import torch +import torch.nn as nn + +class TextClassifier(nn.Module): + """基于 LSTM 的文本分类模型""" + def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes): + super().__init__() + self.embedding = nn.Embedding(vocab_size, embed_dim) + self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True) + self.fc = nn.Linear(hidden_dim, num_classes) + + def forward(self, x): + # x: (batch, seq_len) 整数索引 + embedded = self.embedding(x) # (batch, seq_len, embed_dim) + output, (h_n, c_n) = self.lstm(embedded) + logits = self.fc(h_n.squeeze(0)) # 取最后隐藏状态 + return logits + +# 使用示例 +model = TextClassifier(vocab_size=10000, embed_dim=128, + hidden_dim=256, num_classes=3) +# 3分类:正面/中性/负面(设计评论情感分析) +\end{lstlisting} + + +\section{GRU:简化版 LSTM} + +GRU(Gated Recurrent Unit)由 Cho 等人于2014年提出,将遗忘门和输入门合并为\textbf{更新门},参数更少,训练更快。 + +\begin{lstlisting} +GRU 结构: + + h_{t-1} ──→ ┌─────────────────┐ ──→ h_t + │ 重置门 r_t │ + x_t ──────→ │ 更新门 z_t │ + │ h̃_t = tanh(...) │ + │ h_t = (1-z_t)⊙h_{t-1} + z_t⊙h̃_t + └─────────────────┘ +\end{lstlisting} + +\subsection{LSTM vs GRU 对比} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +特性 & LSTM & GRU \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +门数量 & 3个(遗忘、输入、输出) & 2个(重置、更新) \\ +细胞状态 & 有独立的细胞状态 c\_t & 无,直接用隐藏状态 \\ +参数量 & 较多 & 较少(约少1/3) \\ +训练速度 & 较慢 & 较快 \\ +适用场景 & 复杂长序列 & 中等长度序列 \\ +\end{longtable} +} + +\subsection{如何选择?} + +\begin{lstlisting} +经验法则: +├── 数据量充足、序列很长 → LSTM(更强的表达能力) +├── 数据量有限、序列中等 → GRU(更快收敛,不易过拟合) +└── 都试试,看验证集表现 → 实践出真知 +\end{lstlisting} + + +\section{设计应用:文本分类与时间序列预测} + +\subsection{应用一:设计文档自动分类} + +\begin{lstlisting}[language=Python] +import torch +import torch.nn as nn + +class DesignDocClassifier(nn.Module): + """将设计文档自动分类为:建筑设计/景观设计/室内设计/平面设计""" + def __init__(self, vocab_size=20000, embed_dim=128, hidden_dim=256): + super().__init__() + self.embedding = nn.Embedding(vocab_size, embed_dim) + self.lstm = nn.LSTM(embed_dim, hidden_dim, + num_layers=2, # 2层 LSTM + bidirectional=True, # 双向:同时看前后文 + dropout=0.3, + batch_first=True) + self.fc = nn.Linear(hidden_dim * 2, 4) # 4个设计类别 + + def forward(self, x): + embedded = self.embedding(x) + output, _ = self.lstm(embedded) + # 取正反向最后隐藏状态拼接 + logits = self.fc(output[:, -1, :]) + return logits +\end{lstlisting} + +\subsection{应用二:建筑能耗时间序列预测} + +\begin{lstlisting}[language=Python] +import torch +import torch.nn as nn + +class EnergyPredictor(nn.Module): + """基于 LSTM 的建筑能耗预测模型""" + def __init__(self, input_dim=6, hidden_dim=64, pred_steps=24): + super().__init__() + # input_dim: 温度、湿度、光照、人流量、时间(时)、星期几 + self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers=2, + dropout=0.2, batch_first=True) + self.fc = nn.Linear(hidden_dim, pred_steps) # 预测未来24小时 + + def forward(self, x): + # x: (batch, past_hours, features) 过去若干小时的数据 + _, (h_n, _) = self.lstm(x) + prediction = self.fc(h_n[-1]) # 最后一层的隐藏状态 + return prediction +\end{lstlisting} + + +\section{注意力革命} + +\section{RNN 的瓶颈:串行计算的困境} + +尽管 LSTM 和 GRU 缓解了梯度消失问题,但 RNN 的根本架构限制依然存在: + +\begin{lstlisting} +RNN 的串行瓶颈: + +时间步: t=1 t=2 t=3 t=4 t=5 + │ │ │ │ │ + ▼ ▼ ▼ ▼ ▼ + ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ + x₁ → │h₁│→ │h₂│→ │h₃│→ │h₃│→ │h₅│ → 输出 + └───┘ └───┘ └───┘ └───┘ └───┘ + +问题1:必须等 t=1 算完才能算 t=2,无法并行! +问题2:h₅ 能充分了解 x₁ 的信息吗?(远距离依赖) +\end{lstlisting} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}ll@{}} +\toprule\noalign{} +RNN 的局限 & 具体影响 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +串行计算 & 训练速度慢,无法利用 GPU 并行能力 \\ +长距离依赖衰减 & 即使是 LSTM,50步以上的依赖也会衰减 \\ +固定的信息压缩 & 无论序列多长,都压缩到一个固定大小的 h\_t \\ +单向信息流 & 后面的信息无法影响前面的理解(除非用双向) \\ +\end{longtable} +} + +2017年,一篇名为《Attention Is All You Need》的论文彻底改变了这一局面。 + + +\section{Self-Attention:自注意力机制} + +\subsection{核心思想} + +自注意力让序列中的每个位置都能\textbf{直接}与所有其他位置''交流'',一步到位地获取全局信息。 + +\begin{lstlisting} +传统 RNN(串行传递信息): + + "设计" → "这个" → "客厅" → "的" → "风格" + ↑ + 需要回溯4步才能看到"设计" + +Self-Attention(直接连接): + + "设计" ─────────────────────→ "风格" + ↘ ↗ + "这个" ──→ "客厅" + ↗ ↘ + "的" ──────────────────→ "风格" + +每个词都可以直接"看到"所有其他词! +\end{lstlisting} + +\subsection{Q、K、V 机制} + +Self-Attention 借鉴了信息检索的思想: + +\begin{lstlisting} +类比:在图书馆找书 + + Q(Query/查询) = "我想找关于北欧风格室内设计的书" + K(Key/键) = 每本书的标签:"现代设计""北欧风格""古典建筑"... + V(Value/值) = 每本书的实际内容 + +计算过程: + 1. Q 和每个 K 比较相似度 → 得到"关注程度" + 2. 按关注程度加权求和 V → 得到最终结果 +\end{lstlisting} + +在序列建模中,每个位置同时扮演 Q、K、V 三个角色: + +\begin{lstlisting} +输入序列 X:[x₁, x₂, x₃, x₄] + +线性变换: + Q = X · W_Q # 查询矩阵:我想找什么? + K = X · W_K # 键矩阵:我包含什么信息? + V = X · W_V # 值矩阵:我的具体内容是什么? +\end{lstlisting} + +\subsection{Scaled Dot-Product Attention}\label{scaled-dot-product-attention} + +完整的注意力计算公式: + +\begin{lstlisting} + Q · Kᵀ +Attention(Q,K,V) = softmax(─────) · V + √d_k + +步骤分解: + + 步骤1:计算注意力分数 + scores = Q · Kᵀ # 矩阵乘法,得到每对位置的相似度 + + 步骤2:缩放 + scores = scores / √d_k # 除以维度平方根,防止梯度消失 + + 步骤3:归一化 + weights = softmax(scores) # 转为概率分布,和为1 + + 步骤4:加权求和 + output = weights · V # 按注意力权重聚合信息 +\end{lstlisting} + +\subsection{为什么要缩放(Scale)?} + +\begin{lstlisting} +当 d_k 较大时,Q·Kᵀ 的值也会很大 +→ softmax 输入很大时会进入"饱和区" +→ 梯度变得极小,训练困难 +→ 除以 √d_k 将值拉回合理范围 + +示例(d_k = 64): + 缩放前:softmax([10, 8, 3, -5]) → [0.87, 0.12, 0.001, 0.000001] + 缩放后:softmax([1.25, 1.0, 0.375, -0.625]) → [0.38, 0.30, 0.16, 0.07] +\end{lstlisting} + +\subsection{代码实现} + +\begin{lstlisting}[language=Python] +import torch +import torch.nn.functional as F + +def scaled_dot_product_attention(Q, K, V): + """ + Q: (batch, seq_len, d_k) + K: (batch, seq_len, d_k) + V: (batch, seq_len, d_v) + """ + d_k = Q.size(-1) + + # 步骤1 & 2: 计算缩放后的注意力分数 + scores = torch.matmul(Q, K.transpose(-2, -1)) / (d_k ** 0.5) + + # 步骤3: softmax 归一化 + weights = F.softmax(scores, dim=-1) + + # 步骤4: 加权求和 + output = torch.matmul(weights, V) + + return output, weights + +# 示例:对句子"客厅 采用 开放式 布局"做自注意力 +seq_len, d_k = 4, 64 +Q = torch.randn(1, seq_len, d_k) +K = torch.randn(1, seq_len, d_k) +V = torch.randn(1, seq_len, d_k) + +output, attn_weights = scaled_dot_product_attention(Q, K, V) +print(f"注意力权重形状: {attn_weights.shape}") # (1, 4, 4) - 每个词对其他词的关注度 +print(f"输出形状: {output.shape}") # (1, 4, 64) +\end{lstlisting} + + +\section{Multi-Head Attention:多头注意力} + +\subsection{为什么需要多头?} + +单个注意力头只能学习一种''关注模式''。现实中的语言理解需要同时关注多种关系: + +\begin{lstlisting} +句子:"设计师用木质材料打造了温馨的北欧风格客厅" + +头1 关注:语法关系 → "设计师"是主语,"打造"是谓语 +头2 关注:修饰关系 → "温馨的"修饰"客厅","北欧风格"修饰"客厅" +头3 关注:语义关系 → "木质材料"与"北欧风格"语义关联 +头4 关注:设计属性 → "温馨"是情感描述,"北欧风格"是风格类别 +\end{lstlisting} + +\subsection{结构示意} + +\begin{lstlisting} +输入 X + │ + ├──→ Head 1: Q₁=X·W₁ᵠ, K₁=X·W₁ᵏ, V₁=X·W₁ᵛ → Attention(Q₁,K₁,V₁) → head₁ + ├──→ Head 2: Q₂=X·W₂ᵠ, K₂=X·W₂ᵏ, V₂=X·W₂ᵛ → Attention(Q₂,K₂,V₂) → head₂ + ├──→ Head 3: Q₃=X·W₃ᵠ, K₃=X·W₃ᵏ, V₃=X·W₃ᵛ → Attention(Q₃,K₃,V₃) → head₃ + │ ... + └──→ Head h: Qₕ=X·Wₕᵠ, Kₕ=X·Wₕᵏ, Vₕ=X·Wₕᵛ → Attention(Qₕ,Kₕ,Vₕ) → headₕ + │ + Concat(head₁, ..., headₕ) → Linear → Output │ +\end{lstlisting} + +\subsection{代码实现} + +\begin{lstlisting}[language=Python] +class MultiHeadAttention(nn.Module): + def __init__(self, d_model, num_heads): + super().__init__() + assert d_model % num_heads == 0 + + self.d_k = d_model // num_heads + self.num_heads = num_heads + + # 为每个头创建 Q, K, V 的线性变换 + self.W_q = nn.Linear(d_model, d_model) + self.W_k = nn.Linear(d_model, d_model) + self.W_v = nn.Linear(d_model, d_model) + self.W_o = nn.Linear(d_model, d_model) + + def forward(self, x): + batch_size = x.size(0) + + # 线性变换并分割为多头 + Q = self.W_q(x).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) + K = self.W_k(x).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) + V = self.W_v(x).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) + + # 计算注意力 + attn_output, _ = scaled_dot_product_attention(Q, K, V) + + # 合并多头 + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.view(batch_size, -1, self.num_heads * self.d_k) + + # 最终线性变换 + return self.W_o(attn_output) +\end{lstlisting} + + +\section{Positional Encoding:位置编码} + +\subsection{为什么需要位置信息?} + +Self-Attention 本身是''位置无关''的——它把输入看作一个集合(Set),而不是序列(Sequence): + +\begin{lstlisting} +输入 A:"客厅 在 北面" +输入 B:"北面 在 客厅" + +Self-Attention 不加位置信息时,会把两者视为完全相同! +(因为词相同,只是顺序不同,但 Attention 是排列不变的) +\end{lstlisting} + +\subsection{正弦/余弦位置编码} + +Transformer 使用正弦和余弦函数为每个位置生成独特的编码: + +\begin{lstlisting} +PE(pos, 2i) = sin(pos / 10000^(2i/d_model)) +PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model)) + +其中: + pos = 位置索引(第几个词) + i = 维度索引 + d_model = 模型维度 +\end{lstlisting} + +\begin{lstlisting} +位置编码示意(d_model=4 简化版): + +位置0: [sin(0), cos(0), sin(0), cos(0) ] +位置1: [sin(1), cos(1), sin(0.0001), cos(0.0001) ] +位置2: [sin(2), cos(2), sin(0.0002), cos(0.0002) ] +位置3: [sin(3), cos(3), sin(0.0003), cos(0.0003) ] +... +\end{lstlisting} + +\subsection{代码实现} + +\begin{lstlisting}[language=Python] +import torch +import math + +def positional_encoding(seq_len, d_model): + """生成位置编码矩阵""" + pe = torch.zeros(seq_len, d_model) + position = torch.arange(0, seq_len).unsqueeze(1).float() + + # 计算频率 + div_term = torch.exp( + torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model) + ) + + pe[:, 0::2] = torch.sin(position * div_term) # 偶数维度 + pe[:, 1::2] = torch.cos(position * div_term) # 奇数维度 + + return pe + +# 示例:为长度50的序列生成64维位置编码 +pe = positional_encoding(50, 64) +print(f"位置编码形状: {pe.shape}") # (50, 64) +\end{lstlisting} + + +\section{Self-Attention vs RNN:全面对比} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +特性 & RNN/LSTM & Self-Attention \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +计算方式 & 串行(逐步) & 并行(一步) \\ +长距离依赖 & 需要传递多步,信息衰减 & 任意距离,一步直达 \\ +训练速度 & 慢(无法充分并行) & 快(GPU 友好) \\ +位置信息 & 天然有序(按时间步处理) & 需要额外位置编码 \\ +内存消耗 & O(1) 每步 & O(n²) 需存储 n×n 注意力矩阵 \\ +适用长度 & 中短序列(\textless100) & 中长序列(\textless 数万,受内存限制) \\ +\end{longtable} +} + +\begin{lstlisting} +计算复杂度对比: + + RNN: O(n · d²) - 线性于序列长度 + Attention: O(n² · d) - 二次于序列长度 + + 当 n(序列长度)远大于 d(维度)时,Attention 更慢 + 但 Attention 的并行性弥补了这一劣势 +\end{lstlisting} + + +\section{Transformer 架构} + +\section{整体结构} + +Transformer 由 Vaswani 等人在2017年提出,采用 \textbf{Encoder-Decoder}(编码器-解码器)结构: + +\begin{lstlisting} +┌──────────────────────────────────────────────────────────────┐ +│ Transformer 架构 │ +│ │ +│ 输入序列 输出序列 │ +│ "设计一个客厅" "现代简约风格客厅..." │ +│ │ ↑ │ +│ ▼ │ │ +│ ┌──────────────┐ ┌──────────────┐ │ +│ │ Encoder │ │ Decoder │ │ +│ │ ┌────────┐ │ │ ┌────────┐ │ │ +│ │ │ Enc │ │ │ │ Dec │ │ │ +│ │ │ Layer │ │ ────────→ │ │ Layer │ │ │ +│ │ │ ×N │ │ 编码信息 │ │ ×N │ │ │ +│ │ └────────┘ │ │ └────────┘ │ │ +│ └──────────────┘ └──────────────┘ │ +│ ↑ ↑ │ +│ 输入嵌入 输出嵌入 │ +│ + 位置编码 + 位置编码 │ +└──────────────────────────────────────────────────────────────┘ +\end{lstlisting} + + +\section{Encoder Layer(编码器层)} + +每一层编码器包含两个子层: + +\begin{lstlisting} +输入 + │ + ▼ +┌──────────────────────────┐ +│ Multi-Head Attention │ ← 子层1:自注意力 +│ (Self-Attention) │ +└──────────────────────────┘ + │ ↑ + ├──── Add & Norm ────┘ ← 残差连接 + 层归一化 + │ + ▼ +┌──────────────────────────┐ +│ Feed-Forward Network │ ← 子层2:前馈网络 +│ (FFN) │ +└──────────────────────────┘ + │ ↑ + ├──── Add & Norm ────┘ ← 残差连接 + 层归一化 + │ + ▼ +输出 → 传递给下一层或 Decoder +\end{lstlisting} + +\subsection{子层详解} + +\textbf{子层1:多头自注意力} + +\begin{lstlisting}[language=Python] +# Encoder 中的 Self-Attention +# Q, K, V 都来自同一个输入 +attn_output = MultiHeadAttention(x, x, x) +x = LayerNorm(x + attn_output) # 残差连接 + 层归一化 +\end{lstlisting} + +\textbf{子层2:前馈网络(FFN)} + +\begin{lstlisting} +FFN(x) = W₂ · ReLU(W₁ · x + b₁) + b₂ + +# 两层线性变换,中间用 ReLU 激活 +# 通常 d_ff = 4 × d_model(先升维再降维) +\end{lstlisting} + +\begin{lstlisting}[language=Python] +class FeedForward(nn.Module): + def __init__(self, d_model, d_ff=2048): + super().__init__() + self.linear1 = nn.Linear(d_model, d_ff) + self.linear2 = nn.Linear(d_ff, d_model) + + def forward(self, x): + return self.linear2(F.relu(self.linear1(x))) +\end{lstlisting} + + +\section{Decoder Layer(解码器层)} + +解码器比编码器多了一个\textbf{交叉注意力}(Cross-Attention)子层: + +\begin{lstlisting} +输入(已生成的输出) + │ + ▼ +┌──────────────────────────┐ +│ Masked Multi-Head │ ← 子层1:掩码自注意力 +│ Self-Attention │ (只能看到已生成的词) +└──────────────────────────┘ + │ ↑ + ├──── Add & Norm ────┘ + │ + ▼ +┌──────────────────────────┐ +│ Multi-Head │ ← 子层2:交叉注意力 +│ Cross-Attention │ Q来自Decoder,K/V来自Encoder +│ (Q: Dec, K,V: Enc) │ +└──────────────────────────┘ + │ ↑ + ├──── Add & Norm ────┘ + │ + ▼ +┌──────────────────────────┐ +│ Feed-Forward Network │ ← 子层3:前馈网络 +└──────────────────────────┘ + │ ↑ + ├──── Add & Norm ────┘ + │ + ▼ +输出 → 传递给下一层或最终线性层 +\end{lstlisting} + +\subsection{Masked Self-Attention:为什么要''掩码''?} + +在生成文本时,模型不能''偷看''未来的词: + +\begin{lstlisting} +生成 "现代 简约 风格 客厅": + + 时刻1:生成 "现代" → 只能看到起始符 [BOS] + 时刻2:生成 "简约" → 只能看到 [BOS, 现代] + 时刻3:生成 "风格" → 只能看到 [BOS, 现代, 简约] + 时刻4:生成 "客厅" → 只能看到 [BOS, 现代, 简约, 风格] + +掩码矩阵(上三角遮住未来信息): + + 现代 简约 风格 客厅 + 现代 [ 1 0 0 0 ] ← 只看自己 + 简约 [ 1 1 0 0 ] ← 看自己和"现代" + 风格 [ 1 1 1 0 ] ← 看前面三个 + 客厅 [ 1 1 1 1 ] ← 看所有 + + 0 = 被遮住(设为 -inf,softmax 后变为 0) +\end{lstlisting} + + +\section{残差连接与层归一化} + +\subsection{残差连接(Residual Connection)} + +\begin{lstlisting} +核心公式:output = LayerNorm(x + Sublayer(x)) + +为什么重要? + ┌──────────────────────────────────────────────┐ + │ 没有残差连接:梯度要穿过每一层 │ + │ x → Layer1 → Layer2 → ... → Layer12 → Loss │ + │ │ + │ 有残差连接:梯度有"捷径"可以直接回传 │ + │ x → Layer1 → (+x) → Layer2 → (+x) → ... │ + │ ↑ │ + │ └── 梯度可以直接沿加法路径回传 ──→ │ + └──────────────────────────────────────────────┘ +\end{lstlisting} + +\subsection{层归一化(Layer Normalization)} + +\begin{lstlisting} +对每个样本的所有特征进行归一化: + + LayerNorm(x) = (x - μ) / σ · γ + β + + 其中 μ, σ 是该样本所有特征的均值和标准差 + γ, β 是可学习的缩放和偏移参数 + +作用:稳定训练过程,加速收敛 +\end{lstlisting} + + +\section{Transformer 三大变体} + +\begin{lstlisting} + Transformer 家族树 + + Original Transformer + (Encoder + Decoder) + ┌────────┴────────┐ + │ │ + ┌──────┴──────┐ ┌─────┴─────┐ + │ │ │ │ + BERT GPT T5/BART + (Encoder-only) (Decoder-only) (Encoder-Decoder) + │ │ │ + 理解为主 生成为主 理解+生成 +\end{lstlisting} + +\subsection{BERT(Encoder-only)}\label{bertencoder-only} + +\begin{lstlisting} +特点:双向理解,擅长"阅读理解" + +训练方式: + 1. MLM(Masked Language Model):随机遮住15%的词,让模型预测 + "客厅采用了[MASK]风格的设计" → 预测 [MASK] = "北欧" + + 2. NSP(Next Sentence Prediction):判断两句话是否相邻 + +擅长任务: + - 文本分类(设计文档分类) + - 命名实体识别(提取设计要素) + - 问答系统(设计知识库问答) + - 情感分析(用户评价分析) +\end{lstlisting} + +\subsection{GPT(Decoder-only)}\label{gptdecoder-only} + +\begin{lstlisting} +特点:自回归生成,擅长"续写" + +训练方式: + 给定前面的词,预测下一个词: + "设计师选择的" → 预测下一个词(可能是"材料"/"色彩"/"风格") + +擅长任务: + - 文本生成(设计描述生成) + - 对话系统(设计咨询助手) + - 代码生成(设计自动化) + - 创意构思(头脑风暴) +\end{lstlisting} + +\subsection{T5(Encoder-Decoder)}\label{t5encoder-decoder} + +\begin{lstlisting} +特点:用统一的"文本到文本"框架处理所有NLP任务 + +设计理念: + 所有NLP任务都转化为:输入文本 → 输出文本 + + 翻译: "translate English to Chinese: Hello" → "你好" + 摘要: "summarize: 很长的设计文档..." → "核心要点..." + 分类: "classify: 这是一篇关于景观的文章" → "景观设计" +\end{lstlisting} + +\subsection{三大变体对比} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}llll@{}} +\toprule\noalign{} +特性 & BERT & GPT & T5 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +架构 & Encoder & Decoder & Encoder-Decoder \\ +方向 & 双向 & 单向(从左到右) & 编码双向,解码单向 \\ +核心能力 & 理解 & 生成 & 理解+生成 \\ +典型规模 & 340M & 117M \textasciitilde{} 1.8T & 60M \textasciitilde{} 11B \\ +设计应用 & 分析评价 & 生成方案 & 转换/翻译 \\ +\end{longtable} +} + + +\section{Token 处理流水线} + +文本进入 Transformer 之前,需要经过完整的预处理流水线: + +\begin{lstlisting} +原始文本 Tokenization Embedding +"设计一个温馨的客厅" → [设,计,一,个,温,馨,的,客,厅] → 每个token → 768维向量 + ↓ + + Positional Encoding + ↓ + 输入 Transformer +\end{lstlisting} + +\subsection{Tokenization:分词} + +\begin{lstlisting} +三种分词策略: + +1. 字符级(Character-level) + "设计" → ["设", "计"] + ✗ 优点:词表小 ✗ 缺点:序列太长,丢失词义 + +2. 词级(Word-level) + "设计一个客厅" → ["设计", "一个", "客厅"] + ✓ 优点:保留语义 ✗ 缺点:词表巨大,无法处理新词 + +3. 子词级(Subword-level) ← BPE/GPT 使用的方式 + "uncomfortable" → ["un", "comfort", "able"] + ✓ 优点:平衡词表大小和语义 ✓ 缺点:无明显缺点 +\end{lstlisting} + +\begin{lstlisting}[language=Python] +# 使用 HuggingFace 的分词器 +from transformers import AutoTokenizer + +tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese") +tokens = tokenizer("设计一个温馨的客厅") +print(f"Token IDs: {tokens['input_ids']}") +print(f"Token 文本: {tokenizer.convert_ids_to_tokens(tokens['input_ids'])}") + +# 输出示例: +# Token IDs: [101, 6371, 2552, 671, 702, 3649, 5889, 4638, 2642, 1079, 102] +# Token 文本: ['[CLS]', '设', '计', '一', '个', '温', '馨', '的', '客', '厅', '[SEP]'] +\end{lstlisting} + + +\section{大语言模型} + +\section{从 Transformer 到大语言模型} + +Transformer 论文发表后的几年里,研究者们发现了一个关键规律:\textbf{只要持续增大模型的规模(参数量、数据量、计算量),模型的能力就会不断提升}。这就是 Scaling Law 的威力。 + +大语言模型(Large Language Model, LLM)的演进时间线: + +\begin{lstlisting} +模型规模指数级增长: + +参数量 + │ + │ GPT-4 + │ (~1.8T) + │ GPT-3 + │ (175B) ────────╮ + │ GPT-2 │ + │ (1.5B) │ + │ GPT-1 │ + │ (117M) │ + │ BERT │ + │ (340M) │ + │ │ + └──┴─────┴──────┴──────┴──────┴──────┴───────┴──── 时间 + 2018 2018 2019 2020 2022 2023 +\end{lstlisting} + + +\section{GPT 系列演进} + +\subsection{GPT-1(2018):奠定基础} + +\begin{lstlisting} +参数量:117M +训练数据:约5GB文本 +核心贡献:证明了"预训练 + 微调"范式的有效性 + + 预训练阶段:在大规模无标注文本上学习语言规律 + 微调阶段:在小规模有标注数据上适应特定任务 +\end{lstlisting} + +\subsection{GPT-2(2019):规模的力量} + +\begin{lstlisting} +参数量:1.5B(15亿) +训练数据:约40GB文本(WebText) +核心发现:模型足够大时,无需微调就能完成多种任务 + + "零样本学习"(Zero-shot)能力初现: + 直接输入任务描述,模型就能理解并执行 +\end{lstlisting} + +\subsection{GPT-3(2020):涌现能力} + +\begin{lstlisting} +参数量:175B(1750亿) +训练数据:约570GB文本 +核心突破:少样本学习(Few-shot Learning) + + 无需更新参数,只需给几个例子: + ┌──────────────────────────────────────────────────────┐ + │ Prompt: │ + │ │ + │ 将设计风格翻译为英文: │ + │ 北欧风格 → Nordic style │ + │ 日式风格 → Japanese style │ + │ 工业风格 → │ + │ │ + │ GPT-3 输出:Industrial style │ + └──────────────────────────────────────────────────────┘ +\end{lstlisting} + +\subsection{ChatGPT(2022):对话能力的飞跃} + +\begin{lstlisting} +核心创新:RLHF(基于人类反馈的强化学习) +意义:让 AI 学会了"对话" + + GPT-3(之前): + 用户:"帮我设计一个客厅" + GPT-3:"客厅是家庭活动的中心空间..." ← 像百科全书 + + ChatGPT: + 用户:"帮我设计一个客厅" + ChatGPT:"很乐意帮忙!请问: + 1. 客厅面积多大? + 2. 预算范围? + 3. 喜欢什么风格? + 我可以根据这些信息给你更具体的建议。" + ← 像真正的设计师在对话 +\end{lstlisting} + +\subsection{GPT-4(2023):多模态能力} + +\begin{lstlisting} +核心突破:不仅能理解文本,还能理解图像 + + 输入:一张客厅照片 + "如何改善这个空间?" + 输出:"根据照片分析: + 1. 自然光不足 → 建议增加镜面元素反射光线 + 2. 家具尺度偏大 → 建议换用低矮家具增加空间感 + 3. 色调单一 → 建议添加暖色软装点缀..." + +模型规模的飞跃: + + ┌──────────────────────────────────────┐ + │ GPT-1 GPT-2 GPT-3 GPT-4 │ + │ 117M → 1.5B → 175B → ~1.8T │ + │ │ + │ ×13 ×117 ×15,000 ×15,000 │ + │ (相对GPT-1) │ + └──────────────────────────────────────┘ +\end{lstlisting} + + +\section{训练范式:预训练 → 微调 → 指令调优} + +大语言模型的训练分为三个阶段: + +\begin{lstlisting} +阶段1:预训练(Pre-training) + 目标:学习语言的基础知识 + 数据:互联网海量文本(TB级别) + 方法:预测下一个词 + 成本:极高(数百万美元) + + "这个客厅采用了" → "现代简约" ← 正确答案 + + ↓ + +阶段2:监督微调(Supervised Fine-Tuning, SFT) + 目标:学会遵循指令 + 数据:人工编写的(指令, 回答)对 + 方法:继续训练,但用有标注数据 + + 指令:"描述一下北欧风格的特点" + 回答:"北欧风格以简洁、自然、功能性为核心..." + + ↓ + +阶段3:对齐优化(Alignment) + 目标:让回答更符合人类偏好 + 数据:人类对多个回答的排序 + 方法:RLHF / DPO + + 问题:"设计一个50平米的客厅" + 回答A:"以下是设计方案..." ← 较好 + 回答B:"我无法帮您..." ← 较差 + 人类标注:A > B → 模型学习人类偏好 +\end{lstlisting} + +\subsection{中国的大语言模型} + +\begin{lstlisting} +┌─────────────────────────────────────────────────────┐ +│ 模型名称 开发机构 特点 │ +├─────────────────────────────────────────────────────┤ +│ 文心一言 百度 中文理解能力强 │ +│ 通义千问 阿里巴巴 多模态能力突出 │ +│ 智谱清言 智谱AI 开源生态活跃 │ +│ Kimi 月之暗面 长文本处理能力 │ +│ DeepSeek 深度求索 推理能力突出 │ +│ 讯飞星火 科大讯飞 教育领域深耕 │ +└─────────────────────────────────────────────────────┘ +\end{lstlisting} + + +\section{LLM 关键技术} + +\section{RAG:检索增强生成} + +\subsection{问题:大模型的''幻觉''} + +LLM 会自信地编造不存在的事实: + +\begin{lstlisting} +用户:"北京故宫的建筑面积是多少?" +LLM(幻觉):"北京故宫的建筑面积约为25万平方米。" +(实际约15万平方米) + +原因:LLM 的知识来自训练数据,无法实时更新 + 它生成的是"最可能"的答案,而非"最正确"的答案 +\end{lstlisting} + +\subsection{RAG 架构} + +RAG(Retrieval-Augmented Generation)通过引入外部知识库来解决幻觉问题: + +\begin{lstlisting} +用户提问 + │ + ▼ +┌──────────────┐ +│ 1. 检索阶段 │ 在知识库中搜索相关文档 +│ (Retrieve) │ +└──────────────┘ + │ + │ 检索到的相关文档 + ▼ +┌──────────────┐ +│ 2. 增强阶段 │ 将问题 + 相关文档拼接为增强提示 +│ (Augment) │ +└──────────────┘ + │ + │ 增强后的 Prompt + ▼ +┌──────────────┐ +│ 3. 生成阶段 │ LLM 基于增强信息生成回答 +│ (Generate) │ +└──────────────┘ + │ + ▼ +准确、有据可查的回答 +\end{lstlisting} + +\subsection{设计领域 RAG 示例} + +\begin{lstlisting}[language=Python] +# 概念代码:设计知识库 RAG 系统 + +# 步骤1:建立知识库(将设计规范文档分块并编码) +documents = [ + "住宅设计规范:客厅净高不应低于2.4米...", + "建筑采光标准:居住空间采光系数不低于2%...", + "无障碍设计规范:门道净宽不小于0.8米...", + # ... 更多设计规范文档 +] + +# 步骤2:用户提问 +query = "办公空间的人均面积标准是多少?" + +# 步骤3:检索相关文档 +relevant_docs = retrieve(query, knowledge_base) +# 返回: ["办公建筑设计标准:普通办公空间人均使用面积不小于6平方米..."] + +# 步骤4:构建增强提示 +augmented_prompt = f""" +根据以下参考资料回答问题。如果资料中没有相关信息,请说明。 + +参考资料: +{relevant_docs} + +问题:{query} +""" + +# 步骤5:LLM 生成回答 +answer = llm.generate(augmented_prompt) +# 输出: "根据《办公建筑设计标准》,普通办公空间人均使用面积不应小于6平方米。" +\end{lstlisting} + +\subsection{RAG 的优势} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}ll@{}} +\toprule\noalign{} +优势 & 说明 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +减少幻觉 & 回答基于真实文档,有据可查 \\ +知识更新 & 只需更新知识库,无需重新训练模型 \\ +领域适配 & 轻松添加专业设计知识 \\ +可追溯性 & 可以提供答案来源 \\ +\end{longtable} +} + + +\section{RLHF:基于人类反馈的强化学习} + +\subsection{三个训练阶段} + +\begin{lstlisting} +阶段1:监督微调(SFT) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 人类编写示范回答 → 训练模型模仿 + + 示例: + 指令:"设计一个50人的办公空间" + 示范回答:"建议采用开放式布局..." + +阶段2:训练奖励模型(Reward Model) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 模型生成多个回答 → 人工排序 → 训练打分模型 + + 问题:"设计一个50人的办公空间" + 回答A: ████████████ 评分: 8 ← 人工标注 + 回答B: ██████████ 评分: 6 + 回答C: ██████ 评分: 3 + + → 训练一个能自动评分的 Reward Model + +阶段3:强化学习优化(RL) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 用 PPO 算法让模型生成高分回答 + + 模型生成回答 → Reward Model 打分 → 更新模型参数 + 重复这个过程,让模型学会生成人类偏好的回答 +\end{lstlisting} + +\subsection{RLHF 的设计意义} + +\begin{lstlisting} +通过 RLHF,大模型学会了: + + ✓ 遵循设计约束(面积、预算、规范) + ✓ 结构化输出(分点描述,层次清晰) + ✓ 适度创意(在合理范围内创新) + ✓ 安全意识(遵守安全规范和伦理标准) + ✗ 避免不切实际的方案 + ✗ 避免忽略用户的核心需求 +\end{lstlisting} + + +\section{Prompt Engineering:提示工程} + +\subsection{核心原则} + +Prompt Engineering 是与大语言模型有效沟通的''艺术与科学'': + +\begin{lstlisting} +原则一:明确任务 +━━━━━━━━━━━━━━━━ + ✗ 模糊:"帮我设计一个空间" + ✓ 明确:"请为一个30平米的客厅设计一个简约风格的家具布局方案" + +原则二:提供示例(Few-shot) +━━━━━━━━━━━━━━━━ + 在提示中给出1-3个示例,让模型理解期望的输出格式 + +原则三:指定格式 +━━━━━━━━━━━━━━━━ + "请按以下格式输出: + 1. 设计理念(50字以内) + 2. 空间布局(分点描述) + 3. 材料建议(列表形式) + 4. 预估预算(表格形式)" + +原则四:角色设定 +━━━━━━━━━━━━━━━━ + "你是一位有15年经验的室内设计师,擅长小户型改造..." +\end{lstlisting} + +\subsection{设计应用示例} + +\begin{lstlisting} +Prompt: 设计一个50人的办公空间 + +角色设定: +你是一位资深办公空间设计师,熟悉人体工程学和现代办公理念。 + +任务要求: +- 面积:约200平方米 +- 人数:50人 +- 类型:科技创业公司 +- 风格:现代简约 +- 需要考虑:开放工位、会议室、休息区、茶水间 + +请按以下结构输出: +1. 空间规划方案 +2. 动线设计要点 +3. 家具选型建议 +4. 照明设计方案 +5. 预估造价 + +--- + +LLM 输出(示例): + +1. 空间规划方案 + ├── 开放工位区(120㎡):40个工位,2人/组 + ├── 独立办公区(20㎡):2间,各容纳5人 + ├── 会议室(30㎡):1间大会议室 + 2间小会议室 + ├── 休息区(15㎡):沙发、茶水台 + └── 茶水间(15㎡):吧台、储物柜 + +2. 动线设计要点 + ├── 主通道宽度 ≥ 1.2m + ├── 入口直通开放区,减少干扰 + └── 会议室靠近入口,方便访客 + ... +\end{lstlisting} + +\subsection{Prompt 设计模式} + +\begin{lstlisting} +┌─────────────────────────────────────────────────┐ +│ 模式 适用场景 示例 │ +├─────────────────────────────────────────────────┤ +│ Zero-shot 简单任务 "翻译:你好" │ +│ Few-shot 格式化输出 给2-3个范例 │ +│ Chain-of 复杂推理 "让我们一步步 │ +│ Thought 来思考..." │ +│ Role-play 专业领域 "你是一名建筑 │ +│ 设计师..." │ +│ Template 结构化输出 固定输出模板 │ +└─────────────────────────────────────────────────┘ +\end{lstlisting} + + +\section{设计应用} + +\section{应用一:设计文档文本分类} + +\begin{lstlisting} +场景:设计公司收到大量项目文档,需要自动分类归档 + + 输入文档 → 文本分类模型 → 类别标签 + "本项目采用新中式园林风格..." → "景观设计" + "室内空间以简约风格为主..." → "室内设计" + "建筑主体采用框架剪力墙..." → "建筑设计" +\end{lstlisting} + +\begin{lstlisting}[language=Python] +from transformers import AutoModelForSequenceClassification, AutoTokenizer +import torch + +# 加载预训练的中文文本分类模型 +model_name = "bert-base-chinese" +tokenizer = AutoTokenizer.from_pretrained(model_name) +model = AutoModelForSequenceClassification.from_pretrained( + model_name, num_labels=4 # 4个设计类别 +) + +# 分类推理 +text = "本方案采用开放式布局,以白色和原木色为主色调" +inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) +outputs = model(**inputs) +predicted_class = torch.argmax(outputs.logits, dim=1) + +categories = ["建筑设计", "景观设计", "室内设计", "平面设计"] +print(f"分类结果: {categories[predicted_class]}") +# 输出: 分类结果: 室内设计 +\end{lstlisting} + +\section{应用二:用户评价情感分析} + +\begin{lstlisting} +场景:分析用户对设计方案的反馈 + + "新方案的空间利用很合理,采光也不错" → 正面 + "走廊太窄了,家具颜色也不搭配" → 负面 + "基本满足需求,但细节还有改进空间" → 中性 +\end{lstlisting} + +\begin{lstlisting}[language=Python] +# 使用预训练模型进行情感分析 +from transformers import pipeline + +sentiment_analyzer = pipeline( + "sentiment-analysis", + model="uer/roberta-base-finetuned-jd-binary-chinese" +) + +# 批量分析设计评价 +reviews = [ + "这个设计方案很有创意,空间利用率很高", + "配色方案不太协调,建议调整", + "整体还不错,就是预算偏高" +] + +for review in reviews: + result = sentiment_analyzer(review) + print(f"评价: {review}") + print(f"情感: {result[0]['label']} (置信度: {result[0]['score']:.2%})") + print() +\end{lstlisting} + +\section{应用三:设计描述自动生成} + +\begin{lstlisting} +场景:根据设计参数自动生成方案描述文本 + + 输入参数: + - 空间类型:客厅 + - 面积:35平方米 + - 风格:现代简约 + - 主色:白色 + 原木色 + - 需求:家庭聚会、阅读角 + + 生成描述: + "本方案为35平方米的客厅空间设计,采用现代简约风格。 + 空间以白色和原木色为主色调,营造明亮温馨的氛围。 + 布局上,沙发区面向景观窗,可满足家庭聚会需求; + 窗边设置阅读角,配备落地灯和单人沙发。 + 整体动线流畅,兼顾功能性与美感。" +\end{lstlisting} + +\section{应用四:对话式设计助手} + +\begin{lstlisting} +场景:设计师通过对话形式获取设计建议 + + ┌──────────────────────────────────────────────────────┐ + │ 设计师:我想为一个80平米的小户型做室内设计, │ + │ 业主要求现代简约风格,预算15万。 │ + │ │ + │ AI助手:好的,我来帮您规划。80平米做现代简约是 │ + │ 很好的选择。我有几个问题: │ + │ │ + │ 1. 户型是几室几厅? │ + │ 2. 家庭成员构成?(是否有老人/儿童) │ + │ 3. 有没有特别的空间需求?(书房/衣帽间等) │ + │ │ + │ 设计师:两室一厅,一家三口,孩子5岁,需要一个小书房 │ + │ │ + │ AI助手:明白了。以下是我的初步建议: │ + │ │ + │ 【空间规划】 │ + │ - 主卧:约15㎡(含衣柜区) │ + │ - 儿童房:约10㎡(考虑成长性设计) │ + │ - 客厅+餐厅:约25㎡(开放式布局) │ + │ - 书房:约6㎡(可做半开放式) │ + │ - 厨卫:约12㎡ │ + │ - 阳台:约6㎡(兼顾洗衣和休闲) │ + │ ... │ + └──────────────────────────────────────────────────────┘ +\end{lstlisting} + +\subsection{技术实现思路} + +\begin{lstlisting}[language=Python] +# 对话式设计助手的基本架构 + +class DesignAssistant: + def __init__(self, llm, knowledge_base): + self.llm = llm # 大语言模型 + self.knowledge_base = knowledge_base # 设计知识库 + self.conversation_history = [] + + def chat(self, user_input): + # 1. 从知识库检索相关设计规范 + relevant_docs = self.knowledge_base.retrieve(user_input) + + # 2. 构建增强提示 + system_prompt = """ + 你是一位专业的室内设计顾问。请根据用户需求和 + 参考的设计规范,提供专业、实用的设计建议。 + 回答要有条理,必要时提出追问以明确需求。 + """ + + # 3. 组装完整提示 + messages = [ + {"role": "system", "content": system_prompt}, + *self.conversation_history, + {"role": "user", "content": f"参考资料:{relevant_docs}\n\n用户问题:{user_input}"} + ] + + # 4. 调用 LLM 生成回答 + response = self.llm.chat(messages) + + # 5. 更新对话历史 + self.conversation_history.append({"role": "user", "content": user_input}) + self.conversation_history.append({"role": "assistant", "content": response}) + + return response +\end{lstlisting} + + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \textbf{模型选择}:在设计项目文档分类任务中,你会选择 BERT 还是 GPT 架构?为什么?考虑模型规模、训练成本、任务特点等因素。 +\item + \textbf{RAG vs 微调}:你正在为一家建筑设计院开发 AI 设计助手。设计规范经常更新,且需要提供条文来源。你会选择 RAG 还是模型微调?请分析两种方案的优劣。 +\item + \textbf{Prompt 设计}:尝试设计一个高质量的 Prompt,让大语言模型帮助分析一份景观设计方案的优缺点。你的 Prompt 中应该包含哪些要素?考虑角色设定、输出格式、评估维度等。 +\end{enumerate} + + +\section{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +循环神经网络 & RNN (Recurrent Neural Network) & 处理序列数据的基础网络结构 \\ +长短期记忆网络 & LSTM (Long Short-Term Memory) & 解决 RNN 梯度消失问题的改进结构 \\ +门控循环单元 & GRU (Gated Recurrent Unit) & LSTM 的简化版本,参数更少 \\ +自注意力机制 & Self-Attention & 序列内部元素之间直接计算关联的机制 \\ +缩放点积注意力 & Scaled Dot-Product Attention & 带缩放的注意力计算公式 \\ +多头注意力 & Multi-Head Attention & 多组并行的注意力,捕获多种关系模式 \\ +位置编码 & Positional Encoding & 为序列中的位置信息编码的方法 \\ +Transformer & Transformer & 基于注意力机制的序列模型架构 \\ +掩码注意力 & Masked Attention & 防止解码器看到未来信息的注意力机制 \\ +大语言模型 & LLM (Large Language Model) & 参数量巨大的预训练语言模型 \\ +检索增强生成 & RAG (Retrieval-Augmented Generation) & 结合外部知识库的生成方法 \\ +人类反馈强化学习 & RLHF (Reinforcement Learning from Human Feedback) & 基于人类偏好优化模型的方法 \\ +提示工程 & Prompt Engineering & 设计有效提示以引导模型输出的技术 \\ +分词 & Tokenization & 将文本拆分为最小处理单元的过程 \\ +词嵌入 & Embedding & 将离散的词映射为连续向量表示 \\ +预训练 & Pre-training & 在大规模数据上的初始训练阶段 \\ +微调 & Fine-tuning & 在特定任务数据上的调整训练 \\ +自回归 & Autoregressive & 逐步生成,每步依赖之前输出 \\ +幻觉 & Hallucination & 模型生成看似合理但实际错误的内容 \\ +缩放定律 & Scaling Law & 模型性能与规模之间的关系规律 \\ +\end{longtable} +} + + +\section{延伸阅读} + +\begin{itemize} +\tightlist +\item + \href{https://arxiv.org/abs/1706.03762}{Attention Is All You Need} --- Transformer 原始论文 +\item + \href{https://jalammar.github.io/illustrated-transformer/}{The Illustrated Transformer} --- Transformer 可视化解读 +\item + \href{https://arxiv.org/abs/1810.04805}{BERT: Pre-training of Deep Bidirectional Transformers} --- BERT 论文 +\item + \href{https://arxiv.org/abs/2005.14165}{Language Models are Few-Shot Learners (GPT-3)} --- GPT-3 论文 +\item + \href{https://arxiv.org/abs/2203.02155}{Training language models to follow instructions with human feedback} --- InstructGPT/RLHF 论文 +\item + \href{https://arxiv.org/abs/2005.11401}{Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks} --- RAG 原始论文 +\end{itemize} diff --git a/chapters/ch04-2d-vision.tex b/chapters/ch04-2d-vision.tex new file mode 100644 index 0000000..592496a --- /dev/null +++ b/chapters/ch04-2d-vision.tex @@ -0,0 +1,1048 @@ +\chapter{二维数据——图像与视觉} + +本篇聚焦二维数据的智能处理。图像是最常见的二维数据形式,也是设计领域最核心的信息载体。本篇将追溯从卷积神经网络到视觉Transformer、再到大视觉模型的技术演进脉络,帮助读者理解计算机视觉技术的发展全貌及其在设计领域的广泛应用。 + +\section{篇章导读} + +人类感知世界,约80\%的信息来自视觉。对于设计师而言,图像不仅是设计成果的呈现形式,更是灵感来源、分析对象和沟通媒介。 + +本章将沿着一条清晰的技术演进主线展开:\textbf{从小模型时代(CNN)到大模型时代(Vision Transformer),再到多模态大视觉模型}。我们将看到,计算机视觉如何从''识别图片中的猫''一步步发展到''理解任意场景中的任意内容'',以及这些技术如何赋能建筑识别、街景分析、设计素材管理等设计实践。 + +通过本章学习,你将: + +\begin{itemize} +\tightlist +\item + 理解卷积神经网络(CNN)的核心原理与经典架构 +\item + 掌握目标检测、语义分割等核心视觉任务的原理与方法 +\item + 了解Vision Transformer如何颠覆CNN的统治地位 +\item + 认识CLIP、SAM等大视觉模型带来的范式变革 +\item + 将上述技术思维应用于设计场景分析 +\end{itemize} + + +\section{卷积神经网络} + +\subsection{为什么不用MLP处理图像} + +在第2章中,我们学习了多层感知机(MLP)。一个自然的问题是:\textbf{能否直接用MLP处理图像?} + +假设输入一张 224×224 的RGB图像。如果将其展平为向量,输入维度为: + +\begin{lstlisting} +224 × 224 × 3 = 150,528 +\end{lstlisting} + +若第一个隐藏层有1024个神经元,则该层的参数量为: + +\begin{lstlisting} +150,528 × 1024 + 1024(偏置) ≈ 1.54亿 +\end{lstlisting} + +\textbf{仅仅一层就有1.54亿参数!} 而一个实用的网络通常需要多个隐藏层。这意味着: + +\begin{itemize} +\tightlist +\item + \textbf{参数爆炸}:模型过于庞大,训练困难,极易过拟合 +\item + \textbf{忽略空间结构}:展平操作破坏了像素之间的二维空间关系,而图像的语义恰恰蕴含在空间结构中 +\item + \textbf{平移敏感性}:同一物体出现在图像不同位置时,MLP的响应完全不同 +\end{itemize} + +因此,我们需要一种专为二维数据设计的网络架构——\textbf{卷积神经网络(Convolutional Neural Network, CNN)}。 + +\subsection{CNN的三大核心思想} + +CNN通过三个关键设计解决了MLP的上述缺陷: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +核心思想 & 含义 & 解决的问题 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +局部连接 & 每个神经元只关注局部区域 & 大幅减少参数量 \\ +权重共享 & 同一卷积核在整张图上滑动 & 平移等变性 \\ +层级特征 & 逐层提取从简单到复杂的特征 & 自动学习特征层级 \\ +\end{longtable} +} + +\textbf{直觉理解}:人在识别一张建筑照片时,不会同时关注所有像素,而是先看局部特征(窗户、门、柱子),再组合成整体判断。CNN正是模拟了这种''从局部到整体''的视觉处理方式。 + +\subsection{卷积操作} + +卷积操作是CNN的核心。它通过一个小的\textbf{卷积核(Kernel/Filter)}在输入图像上滑动,逐区域计算加权和,提取局部特征。 + +\textbf{单通道卷积示意}: + +\begin{lstlisting} +输入图像 (5×5) 卷积核 (3×3) 输出特征图 (3×3) +┌───┬───┬───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ +│ 1 │ 0 │ 1 │ 0 │ 1 │ │ 1 │ 0 │-1 │ │ 2 │ 0 │ 1 │ +├───┼───┼───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ +│ 0 │ 1 │ 0 │ 1 │ 0 │ │ 1 │ 0 │-1 │ │ 1 │ 3 │ 2 │ +├───┼───┼───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ +│ 1 │ 0 │ 1 │ 0 │ 1 │ │ 1 │ 0 │-1 │ │ 2 │ 0 │ 1 │ +├───┼───┼───┼───┼───┤ └───┴───┴───┘ └───┴───┴───┘ +│ 0 │ 1 │ 0 │ 1 │ 0 │ +├───┼───┼───┼───┼───┤ +│ 1 │ 0 │ 1 │ 0 │ 1 │ +└───┴───┴───┴───┴───┘ +\end{lstlisting} + +计算过程(左上角第一个输出值): + +\begin{lstlisting} +(1×1 + 0×0 + 1×(-1)) + (0×1 + 1×0 + 0×(-1)) + (1×1 + 0×0 + 1×(-1)) += 1 + 0 - 1 + 0 + 0 + 0 + 1 + 0 - 1 = 0 + +加上偏置后得到输出值 +\end{lstlisting} + +\textbf{多通道卷积}:实际图像通常是RGB三通道。卷积核也需要匹配输入通道数。例如,输入为3通道时,一个 3×3 卷积核的实际尺寸为 3×3×3,对三个通道分别计算后求和,产生一个输出通道。使用多个卷积核即可产生多个输出通道。 + +\begin{lstlisting} +RGB输入 (H×W×3) 多个卷积核 输出特征图 +┌─────────────┐ ┌──────────┐ ┌──────────┐ +│ R通道 │ │核1: 3×3×3│──→ 通道1 │ │ +│ G通道 │ × │核2: 3×3×3│──→ 通道2 │ H'×W'×K │ +│ B通道 │ │ ... │ │ │ +└─────────────┘ │核K: 3×3×3│──→ 通道K │ │ + └──────────┘ └──────────┘ + K个卷积核 +\end{lstlisting} + +\textbf{卷积的关键参数}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +参数 & 含义 & 典型值 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +卷积核大小 & 每次看到的局部区域大小 & 3×3, 5×5 \\ +步长(Stride) & 卷积核每次移动的像素数 & 1, 2 \\ +填充(Padding) & 在输入边缘补零 & 0, 1 \\ +输出通道数 & 使用的卷积核数量 & 64, 128, 256 \\ +\end{longtable} +} + +\subsection{激活函数:ReLU} + +卷积操作是线性的,如果不引入非线性变换,无论堆叠多少层卷积,最终等价于一个线性变换。因此需要在卷积后添加\textbf{激活函数}。 + +CNN中最常用的激活函数是 \textbf{ReLU(Rectified Linear Unit)}: + +\begin{lstlisting} +ReLU(x) = max(0, x) + + 输出 + │ / + │ / + │ / + │ / +─────┼───── 输入 + │ + │ +\end{lstlisting} + +ReLU的优势: + +\begin{itemize} +\tightlist +\item + \textbf{计算简单}:只需判断正负,比Sigmoid和Tanh快得多 +\item + \textbf{缓解梯度消失}:正区间梯度恒为1,反向传播时信号不会衰减 +\item + \textbf{稀疏激活}:负值被置零,使网络天然具有稀疏性 +\end{itemize} + +\subsection{池化操作} + +池化(Pooling)操作的作用是降低特征图的空间尺寸,减少参数量和计算量,同时增强特征的平移不变性。 + +\textbf{最大池化(Max Pooling)示意}: + +\begin{lstlisting} +输入特征图 (4×4) 2×2 最大池化 输出 (2×2) +┌───┬───┬───┬───┐ 步长=2 ┌───┬───┐ +│ 1 │ 3 │ 2 │ 1 │ │ 6 │ 8 │ +├───┼───┼───┼───┤ ┌───┬───┐ ├───┼───┤ +│ 5 │ 6 │ 7 │ 4 │ │max│max│ │ 9 │12 │ +├───┼───┼───┼───┤ └───┴───┘ └───┴───┘ +│ 3 │ 2 │ 1 │ 8 │ max(1,3,5,6)=6 +├───┼───┼───┼───┤ max(2,1,7,4)=7→8修正 6, 8 +│ 4 │ 9 │ 3 │12 │ max(3,2,4,9)=9 9, 12 +└───┴───┴───┴───┘ max(1,8,3,12)=12 +\end{lstlisting} + +池化的效果: + +\begin{itemize} +\tightlist +\item + \textbf{降维}:特征图尺寸减半,计算量减少为1/4 +\item + \textbf{平移不变性}:局部区域内的微小位移不影响最大值 +\item + \textbf{保留主要特征}:最大池化保留了最显著的特征响应 +\end{itemize} + +\subsection{经典架构演进} + +CNN架构在过去二十多年中经历了显著的演进: + +\begin{lstlisting} +LeNet (1998) AlexNet (2012) VGG (2014) ResNet (2015) + 手写数字识别 图像分类突破 结构简洁优雅 解决退化问题 + 6万参数 6000万参数 1.38亿参数 深度可达152层+ + + │ │ │ │ + ▼ ▼ ▼ ▼ + 卷积→池化→ 更深更宽+ 小卷积核 残差连接 + 卷积→池化→ Dropout+ 堆叠(3×3) F(x)+x + 全连接 数据增强 统一规范 +\end{lstlisting} + +\textbf{架构时间线与关键创新}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1765}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1765}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1765}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2941}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1765}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +架构 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +年份 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +深度 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +关键创新 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +意义 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +LeNet-5 & 1998 & 5层 & 首个成功的CNN & 手写数字识别,邮局实用 \\ +AlexNet & 2012 & 8层 & ReLU、Dropout、GPU训练 & ImageNet竞赛冠军,深度学习复兴 \\ +VGGNet & 2014 & 16-19层 & 3×3小卷积核堆叠 & 证明''更深=更好''的简洁设计 \\ +ResNet & 2015 & 152层+ & 残差连接(Skip Connection) & 突破深度瓶颈,可训练极深网络 \\ +\end{longtable} +} + +\subsection{ResNet的残差连接:突破深度瓶颈} + +随着网络加深,出现了一个反直觉的现象:\textbf{网络越深,训练误差反而越大}。这不是过拟合(训练集误差也增大),而是\textbf{退化问题(Degradation Problem)}——深层网络难以优化。 + +ResNet的核心创新是\textbf{残差连接(Residual Connection)}: + +\begin{lstlisting} + 输入 x + │ + │ ┌──────────────────┐ + │ │ │ + └────────→│ 恒等映射(跳过) │ + │ │ + ┌─────────┴────────┐ │ + │ 残差块 F(x) │ │ + │ (两层卷积+ReLU) │ │ + └─────────┬────────┘ │ + │ │ + ▼ ▼ + ⊕ ← ← ← ← ← ← ← ← ┘ + │ + ▼ + 输出 = F(x) + x +\end{lstlisting} + +核心公式: + +\begin{lstlisting} +输出 = F(x) + x +\end{lstlisting} + +其中 F(x) 是残差映射,x 是恒等映射(直接传递)。 + +\textbf{为什么有效?} + +\begin{itemize} +\tightlist +\item + 如果最优解接近恒等映射,网络只需学习残差 F(x) ≈ 0,比从零学习 x 容易得多 +\item + 梯度可以直接通过跳跃连接回传,缓解梯度消失 +\item + 使得训练上百层甚至上千层的网络成为可能 +\end{itemize} + +\begin{quote} +\textbf{设计思维链接}:残差连接的思想类似于设计中的''增量修改''——在保留原有方案(x)的基础上进行改进(F(x)),而非推倒重来。这种''在已有基础上做调整''的策略,在参数空间中比''从零开始学习''高效得多。 +\end{quote} + + +\section{目标检测} + +\subsection{从分类到检测} + +图像分类回答的问题是''这是什么'',而目标检测需要同时回答两个问题: + +\begin{lstlisting} +分类: "这是一张建筑的照片" → what + +检测: "左上角有一栋现代建筑, → what + where + 右下角有一棵树, + 中间有一条道路" +\end{lstlisting} + +目标检测的输出是若干\textbf{边界框(Bounding Box)}及其对应的类别和置信度: + +\begin{lstlisting} +┌─────────────────────────────┐ +│ ┌──────────┐ │ +│ │ 建筑 0.95│ │ +│ └──────────┘ │ +│ ┌─────────┐ │ +│ │ 汽车 │ │ +│ │ 0.87 │ │ +│ └─────────┘ │ +│ ┌────┐ │ +│ │树木│ ┌──────┐ │ +│ │0.92│ │ 行人 │ │ +│ └────┘ │ 0.78 │ │ +│ └──────┘ │ +└─────────────────────────────┘ +\end{lstlisting} + +\subsection{两阶段检测器} + +两阶段方法的思路是''先找候选区域,再分类判别'',精度高但速度较慢。 + +\textbf{演进路线}: + +\begin{lstlisting} +R-CNN (2014) Fast R-CNN (2015) Faster R-CNN (2015) + │ │ │ + ▼ ▼ ▼ +选择性搜索 选择性搜索 区域建议网络 +找2000个候选框 找2000个候选框 (RPN) 自动生成 + │ │ │ + ▼ ▼ ▼ +逐个裁剪送入CNN 整图送入CNN 整图送入CNN +2000次前向传播 共享特征图 共享特征图 + │ │ │ + ▼ ▼ ▼ +SVM分类 ROI Pooling ROI Pooling +边框回归 全连接层分类 全连接层分类 + 边框回归 边框回归 + + 速度:极慢 速度:较快 速度:实时级 + 精度:一般 精度:较高 精度:高 +\end{lstlisting} + +\subsection{单阶段检测器:YOLO系列} + +YOLO(You Only Look Once)的核心思想是:\textbf{一次前向传播同时完成定位和分类},将检测问题转化为回归问题。 + +\textbf{YOLO工作原理}: + +\begin{lstlisting} +输入图像 划分网格 (S×S) 每个网格预测 +┌─────────────┐ ┌───┬───┬───┐ ┌─────────┐ +│ │ │ │ │ │ │B个边界框 │ +│ 目标1 │ → ├───┼───┼───┤ → │(x,y,w,h)│ +│ 目标2│ │ │ │ │ │+ 置信度 │ +│ │ ├───┼───┼───┤ │+ 类别概率│ +└─────────────┘ │ │ │ │ └─────────┘ + └───┴───┴───┘ +\end{lstlisting} + +\textbf{YOLO系列演进}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2143}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2143}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3571}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2143}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +版本 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +年份 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +关键改进 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +特点 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +YOLOv1 & 2016 & 划分网格,统一回归 & 开创单阶段检测,速度快但精度有限 \\ +YOLOv2 & 2017 & Batch Normalization、锚框 & 引入锚框提升召回率 \\ +YOLOv3 & 2018 & 多尺度预测(FPN) & 三种尺度检测,小目标能力提升 \\ +YOLOv4 & 2020 & CSPNet、Mosaic增强 & 训练技巧系统化集成 \\ +YOLOv5 & 2020 & Ultralytics实现 & 工程化、易用性、部署友好 \\ +YOLOv8 & 2023 & Anchor-free、解耦头 & 检测+分割统一框架,当前主流 \\ +\end{longtable} +} + +\textbf{两阶段 vs 单阶段对比}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +维度 & 两阶段(Faster R-CNN) & 单阶段(YOLO) \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +速度 & 较慢(5-10 FPS) & 快(30-160 FPS) \\ +精度 & 高(适合小目标) & 较高(持续提升中) \\ +流程 & 先候选框→再分类 & 端到端回归 \\ +适用场景 & 精度优先 & 实时应用 \\ +\end{longtable} +} + +\subsection{评价指标} + +\textbf{IoU(Intersection over Union)}:衡量预测框与真实框的重合程度。 + +\begin{lstlisting} + 预测框 + ┌───────────┐ + │ ┌──────┼────────┐ + │ 交集区域 │ │ ← 真实框 + │ │ │ │ + └────┼──────┘ │ + └───────────────┘ + + IoU = 交集面积 / 并集面积 + IoU = 1 表示完全重合 + IoU = 0 表示完全不相交 + 通常 IoU ≥ 0.5 视为检测正确 +\end{lstlisting} + +\textbf{mAP(mean Average Precision)}:各类别AP的平均值,是检测任务的综合评价指标。COCO数据集采用 mAP@0.5:0.95(IoU阈值从0.5到0.95的平均值)作为标准指标。 + +\subsection{设计应用} + +目标检测在设计领域有广泛应用: + +\begin{itemize} +\tightlist +\item + \textbf{建筑识别}:从街景或卫星图像中自动检测建筑类型、风格特征 +\item + \textbf{场景分析}:识别城市空间中的元素(道路、绿化、设施),支持设计决策 +\item + \textbf{遗产保护}:自动检测历史建筑构件,辅助数字化记录与保护规划 +\item + \textbf{设计素材管理}:自动标注图片素材中的物体类型,实现智能检索 +\end{itemize} + + +\section{语义分割} + +\subsection{像素级分类} + +如果说图像分类是对整张图给出一个标签,目标检测是给每个物体画一个框,那么\textbf{语义分割(Semantic Segmentation)}则是对每个像素给出一个类别标签——它是像素级别的分类任务。 + +\begin{lstlisting} +图像分类 目标检测 语义分割 +┌───────┐ ┌───────┐ ┌───────┐ +│ │ │ ┌───┐ │ │AAAAA │ +│ 猫 │ │ │猫 │ │ │AA┌──┐A│ +│ │ │ └───┘ │ │──│猫│─│ +└───────┘ │ ┌──┐│ │BB│ │B│ + "猫" │ │狗││ │BB└──┘B│ + └───┴──┘┘ └───────┘ + 猫+狗的位置 每个像素的类别 + +A=背景 B=地面 猫/狗=对应类别 +\end{lstlisting} + +\subsection{全卷积网络(FCN)} + +FCN(Fully Convolutional Network, 2015)是语义分割的开创性工作,其核心思想是:\textbf{将分类网络中的全连接层替换为卷积层},使网络可以接受任意尺寸的输入,并输出与输入空间对应的分割图。 + +\begin{lstlisting} +编码器(下采样) 解码器(上采样) +┌────────┐ ┌────────┐ +│ 卷积+池化│ → 1/2 →│ 上采样 │ → 2倍 +│ 卷积+池化│ → 1/4 →│ 上采样 │ → 4倍 +│ 卷积+池化│ → 1/8 →│ 上采样 │ → 8倍 +│ 卷积+池化│ → 1/16 →│ 上采样 │ → 16倍 +└────────┘ └────────┘ + 提取高级语义 恢复空间分辨率 + 分辨率逐步降低 分辨率逐步恢复 +\end{lstlisting} + +\subsection{U-Net:编码器-解码器与跳跃连接} + +U-Net(2015)最初为医学图像分割设计,其对称的编码器-解码器结构和\textbf{跳跃连接(Skip Connection)}使其成为分割领域的经典架构。 + +\begin{lstlisting} + U-Net 结构示意 + + 编码器(收缩路径) 解码器(扩展路径) + + 输入 ──→ [ conv×2 ] ────────────────────→ [ conv×2 ] ──→ 输出 + │ 64 │ 64 + ↓ pool upsample ↑ + [ conv×2 ] ────────────────────→ [ conv×2 ] + │ 128 │ 128 + ↓ pool upsample ↑ + [ conv×2 ] ────────────────────→ [ conv×2 ] + │ 256 │ 256 + ↓ pool upsample ↑ + [ conv×2 ] ────────────────────→ [ conv×2 ] + │ 512 │ 512 + ↓ pool upsample ↑ + [ conv×2 ] ← 底部(瓶颈层) → [ conv×2 ] + │ 1024 +\end{lstlisting} + +\textbf{跳跃连接的作用}:编码器中的浅层特征保留了丰富的空间细节信息(如边缘、位置),而深层特征包含高级语义信息。跳跃连接将两者结合,使分割结果既有准确的语义判别,又有精细的空间边界。 + +\subsection{DeepLab系列} + +DeepLab由Google团队提出,其核心创新是\textbf{空洞卷积(Atrous Convolution)}和\textbf{ASPP(Atrous Spatial Pyramid Pooling)}。 + +\textbf{空洞卷积}:在不增加参数量和计算量的前提下扩大感受野。 + +\begin{lstlisting} +标准 3×3 卷积 空洞率=2 的 3×3 卷积 +┌───┬───┬───┐ ┌───┬───┬───┬───┬───┐ +│ * │ * │ * │ │ * │ │ * │ │ * │ +├───┼───┼───┤ ├───┼───┼───┼───┼───┤ +│ * │ * │ * │ │ │ │ │ │ │ +├───┼───┼───┤ ├───┼───┼───┼───┼───┤ +│ * │ * │ * │ │ * │ │ * │ │ * │ +└───┴───┴───┘ ├───┼───┼───┼───┼───┤ + │ │ │ │ │ │ +感受野: 3×3 ├───┼───┼───┼───┼───┤ + │ * │ │ * │ │ * │ + └───┴───┴───┴───┴───┘ + 感受野: 5×5(不增加参数) +\end{lstlisting} + +\textbf{ASPP}:使用多个不同空洞率的卷积并行提取多尺度上下文信息。 + +\subsection{语义分割 vs 实例分割} + +\begin{lstlisting} +语义分割 实例分割 +┌───────────────┐ ┌───────────────┐ +│AAA BBB AAA │ │A1 B1 A2 │ +│AAA BBB AAA │ │A1 B1 A2 │ +│AAA BBB AAA │ │A1 B1 A2 │ +│ CCC BBB │ │ C1 B2 │ +└───────────────┘ └───────────────┘ + +每个像素标记类别 区分同类的不同实例 +不区分个体 A1≠A2, B1≠B2 + +例:所有建筑标为同一类 例:每栋建筑单独标记 +\end{lstlisting} + +此外还有\textbf{全景分割(Panoptic Segmentation)},结合了语义分割和实例分割的优点,对背景类进行像素级分类,对前景类进行实例级区分。 + +\subsection{设计应用} + +\begin{itemize} +\tightlist +\item + \textbf{用地分类}:从卫星遥感图像中分割住宅、商业、绿地、水体等用地类型,支持城市规划分析 +\item + \textbf{城市形态分析}:量化建筑密度、街道宽度、开放空间比例等空间指标 +\item + \textbf{绿视率计算}:从街景图像中分割绿色植被区域,计算视野中绿化覆盖比例,评估街道空间品质 +\item + \textbf{天空开敞度}:分割天空区域,分析街道峡谷的天空可见比例 +\end{itemize} + + +\section{视觉Transformer} + +\subsection{ViT:Transformer进入视觉} + +2020年,Google团队提出了 \textbf{ViT(Vision Transformer)},首次证明纯Transformer架构可以在图像任务上达到甚至超越CNN的性能,开启了视觉领域的Transformer时代。 + +\textbf{ViT的核心思路}:将图像切割为固定大小的图块(Patch),将每个图块视为一个''词''(Token),然后送入标准Transformer编码器处理。 + +\begin{lstlisting} +输入图像 (224×224×3) 切分为图块 线性嵌入 +┌───┬───┬───┬───┬───┬───┐ 每个 16×16 每个 patch 展平 +│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ → 14×14=196 → 768维向量 +├───┼───┼───┼───┼───┼───┤ 个 patches +│ 7 │ 8 │ 9 │10 │11 │12 │ +├───┼───┼───┼───┼───┼───┤ │ +│...│...│...│...│...│...│ ▼ +└───┴───┴───┴───┴───┴───┘ 加入位置编码 + (告知空间位置) + │ + ▼ + ┌──────────────────┐ + │ Transformer 编码器 │ + │ (多层自注意力 + │ + │ 前馈网络) │ + └──────────────────┘ + │ + ▼ + 分类头 → 类别预测 +\end{lstlisting} + +\textbf{ViT的处理流程}: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + \textbf{图块切分}:将图像切分为 N 个固定大小的 patch(如 16×16),共 196 个 +\item + \textbf{线性嵌入}:每个 patch 展平后通过线性映射转换为 D 维向量 +\item + \textbf{位置编码}:为每个 patch 向量加入可学习的位置信息 +\item + \textbf{分类 Token}:在序列开头加入一个特殊的 {[}CLS{]} token,用于汇总全局信息 +\item + \textbf{Transformer 编码器}:多层自注意力 + MLP,处理 patch 序列 +\item + \textbf{分类输出}:取 {[}CLS{]} token 的输出进行分类 +\end{enumerate} + +\subsection{为什么ViT有效:全局注意力 vs 局部卷积} + +CNN和ViT处理图像的方式有本质区别: + +\begin{lstlisting} +卷积(局部连接) 自注意力(全局连接) +┌───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┐ +│ │ │ │ │ │ │↔↔│↔↔│↔↏│↔↏│↔↏│ +├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ +│ │[k]│ │ │ │ │↔↏│↔↏│↔↏│↔↏│↔↏│ +├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ +│ │ │ │ │ │ │↔↏│↔↏│↔↏│↔↏│↔↏│ +└───┴───┴───┴───┴───┘ └───┴───┴───┴───┴───┘ + 只看3×3邻域 每个位置关注所有位置 + 感受野受限于层数 第一层就有全局视野 +\end{lstlisting} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +维度 & CNN & ViT \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +感受野 & 受限于卷积核大小和层数 & 第一层即全局感受野 \\ +归纳偏置 & 强(局部性、平移等变性) & 弱(几乎不做假设) \\ +数据需求 & 较少(归纳偏置提供先验) & 较多(需从数据中学习规律) \\ +计算量 & 与分辨率线性相关 & 与patch数二次相关 \\ +远程依赖 & 需要深层堆叠 & 天然建模全局关系 \\ +最适合场景 & 中小规模数据集 & 大规模数据集 \\ +\end{longtable} +} + +\textbf{关键洞察}:CNN通过归纳偏置(局部性假设)在小数据上表现好,但在大数据上,ViT的弱归纳偏置反而成为优势——它可以从海量数据中学到更灵活、更强大的特征表示。 + +\subsection{Swin Transformer}\label{swin-transformer} + +标准ViT的全局注意力计算量与图像大小呈二次关系,难以处理高分辨率图像。\textbf{Swin Transformer(2021)}通过\textbf{层级结构}和\textbf{移位窗口注意力}解决了这一问题。 + +\begin{lstlisting} +标准ViT(单一分辨率) Swin Transformer(层级结构) + +Patch Size: 16×16 Stage 1: 4×4 patch → 高分辨率 + ↓ Patch Merging + ┌─────────────┐ Stage 2: 8×8 patch → 中分辨率 + │ 全局注意力 │ ↓ Patch Merging + │ 所有patch │ Stage 3: 16×16 patch → 低分辨率 + │ 互相通信 │ ↓ Patch Merging + └─────────────┘ Stage 4: 32×32 patch → 最低分辨率 + 计算量: O(N²) + + 窗口内注意力 → 计算量: O(N) +\end{lstlisting} + +\textbf{移位窗口(Shifted Window)}机制: + +\begin{lstlisting} +常规窗口划分 移位窗口划分 +┌───┬───┬───┬───┐ ┌─┬─────┬─────┬─┐ +│ W1│ W1│ W2│ W2│ │ │ W1 │ W2 │ │ +├───┤ ├───┤ │ ├─┤ ├─────┤ │ +│ │ │ │ │ │W5│ │ │W6 +├───┼───┼───┼───┤ ├──┤─────┤─────┤─┤ +│ W3│ W3│ W4│ W4│ │W7│ │ │W8 +├───┤ ├───┤ │ ├─┤ ├─────┤ │ +│ │ │ │ │ │ │ W3 │ W4 │ │ +└───┴───┴───┴───┘ └─┴─────┴─────┴─┘ + +窗口内计算注意力 窗口移位,跨窗口信息交换 +\end{lstlisting} + +Swin Transformer的设计使其兼具CNN的层级特征提取优势和Transformer的强大表达能力,成为视觉Transformer的重要里程碑。 + + +\section{大视觉模型} + +\subsection{从小模型到大模型} + +在前面的章节中,我们讨论的模型(CNN、ViT)通常针对特定任务训练,如分类、检测或分割。\textbf{大视觉模型(Large Vision Model)}代表了一种新的范式:通过大规模预训练,学习通用的视觉理解能力,然后通过提示(Prompt)适配到各种下游任务。 + +\begin{lstlisting} +小模型范式 大模型范式 +┌────────────┐ ┌────────────────┐ +│ 特定任务数据 │ ──→ 训练 ──→ │ 海量多模态数据 │ ──→ 预训练 ──→ +│ (如建筑分类)│ 特定模型 │ (图像+文本对) │ 通用视觉模型 +└────────────┘ └────────────────┘ + │ + ┌──────────┬─────────┼─────────┬──────────┐ + ▼ ▼ ▼ ▼ ▼ + 零样本分类 图文检索 目标分割 视觉问答 任意任务 + (无需微调) (跨模态) (提示驱动) (多模态) (通用能力) +\end{lstlisting} + +\subsection{CLIP:图文对齐与零样本学习} + +\textbf{CLIP(Contrastive Language-Image Pre-training, OpenAI, 2021)}通过对比学习,将图像和文本映射到同一个语义空间,实现了突破性的零样本分类能力。 + +\textbf{训练原理}: + +\begin{lstlisting} + 共享语义空间 + ┌──────────────────┐ + ┌────→│ "一只猫的照片" │←────┐ + │ │ "一条狗的照片" │ │ + │ │ "一栋建筑的照片" │ │ +图像编码器 │ └──────────────────┘ │ 文本编码器 +(ViT/CNN) │ 对比学习 │ (Transformer) + │ 拉近匹配对,推远不匹配对 │ +┌─────────┐ │ │ ┌──────────┐ +│ 🐱 图片 │───┤ ├───┤ "猫" 文本 │ +│ 🐶 图片 │───┘ └───┤ "狗" 文本 │ +└─────────┘ └──────────┘ +\end{lstlisting} + +CLIP的训练目标:对于N个''图像-文本''配对,最大化正确配对的相似度,最小化错误配对的相似度。 + +\textbf{零样本分类}: + +\begin{lstlisting} +输入:一张建筑照片 +候选文本:"一栋住宅的照片" "一栋商业建筑的照片" "一个公园的照片" + +→ 图像编码器提取图像特征 +→ 文本编码器提取每个文本特征 +→ 计算图像与每个文本的相似度 +→ 选择最相似的文本作为分类结果 + +无需任何建筑类别的训练数据! +\end{lstlisting} + +CLIP的意义在于:\textbf{用自然语言定义视觉概念},打破了传统计算机视觉需要固定类别标签的限制。设计师可以用自然语言描述来检索、分类和理解图像。 + +\subsection{SAM:分割一切} + +\textbf{SAM(Segment Anything Model, Meta, 2023)}是一个''可提示''的通用分割模型,能够根据各种提示(点、框、文本)分割图像中的任意目标。 + +\begin{lstlisting} +SAM 的三种提示方式 + + 点提示 框提示 文本提示 +┌───────────┐ ┌───────────┐ ┌───────────┐ +│ │ │ ┌───────┐ │ │ │ +│ ● │ │ │ │ │ │ 建筑 │ +│ ┌───┐ │ │ │ 目标 │ │ │ ┌───┐ │ +│ │ │ │ │ │ │ │ │ │ │ │ +│ └───┘ │ │ └───────┘ │ │ └───┘ │ +│ │ │ │ │ │ +└───────────┘ └───────────┘ └───────────┘ + 点击目标位置 画框框住目标 输入目标名称 + → 分割该目标 → 分割框内目标 → 分割对应目标 +\end{lstlisting} + +\textbf{SAM的核心能力}: + +\begin{itemize} +\tightlist +\item + \textbf{零样本泛化}:训练时没见过的物体类型也能分割 +\item + \textbf{歧义感知}:一个点可能对应多个层级的目标(如点击窗户 → 返回窗户、墙面、建筑三个层级) +\item + \textbf{自动分割}:无需提示,可自动分割图像中的所有物体 +\item + \textbf{海量数据集}:SA-1B数据集包含10亿级自动标注的分割掩码 +\end{itemize} + +SAM的设计理念是成为视觉领域的''基础模型''——像大语言模型处理文本一样,成为处理视觉分割任务的基础设施。 + +\subsection{DINOv2:自监督视觉特征} + +\textbf{DINOv2(Meta, 2023)}通过自监督学习训练,无需人工标注即可学习强大的视觉特征表示。 + +\begin{lstlisting} +训练方式(自蒸馏 + 对比学习) + +┌─────────────┐ ┌─────────────┐ +│ 全局视图 │ │ 局部视图 │ +│ (整张图) │ │ (裁剪块) │ +└──────┬──────┘ └──────┬──────┘ + │ │ + ▼ ▼ +┌──────────────┐ ┌──────────────┐ +│ 教师网络 │ │ 学生网络 │ +│ (EMA更新) │ │ (梯度更新) │ +└──────┬──────┘ └──────┬──────┘ + │ │ + └─────── 对齐 ───────┘ + 使两者的输出一致 +\end{lstlisting} + +DINOv2学到的特征具有惊人的语义对齐能力——无需文本训练,其特征空间自然聚类出语义类别。它可以直接用于: + +\begin{itemize} +\tightlist +\item + 图像检索(找到视觉语义相似的图片) +\item + 密集预测(分割、深度估计) +\item + 图像分类(作为特征提取器) +\end{itemize} + +\subsection{视觉-语言模型} + +大视觉模型发展的一个重要趋势是\textbf{视觉与语言模态的融合}。模型不再仅''看图说话'',而是真正理解图像内容并可以回答关于图像的复杂问题。 + +\textbf{典型任务与模型}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +任务 & 描述 & 代表模型 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +图像描述 & 自动生成图像的自然语言描述 & BLIP, BLIP-2 \\ +视觉问答 & 根据图像内容回答自然语言问题 & LLaVA, GPT-4V \\ +图文检索 & 用文本搜索图像,或反之 & CLIP, ALIGN \\ +指代表达 & 根据语言描述定位图像中的区域 & GLIP, Grounding DINO \\ +视觉对话 & 围绕图像内容进行多轮对话 & LLaVA, Qwen-VL \\ +\end{longtable} +} + +\textbf{模态融合的演进}: + +\begin{lstlisting} +单模态时代 早期多模态 大一统时代 +┌──────────┐ ┌──────────┐ ┌──────────────────┐ +│ 视觉模型 │ │ 视觉+文本 │ │ 统一多模态模型 │ +│ (CNN/ViT)│ │ 浅层融合 │ │ (视觉+语言+更多) │ +├──────────┤ ├──────────┤ ├──────────────────┤ +│ 语言模型 │ → │ 各自编码 │ → │ 共享表示空间 │ +│(RNN/TF) │ │ 拼接特征 │ │ 端到端联合训练 │ +└──────────┘ └──────────┘ └──────────────────┘ +各自独立 简单组合 深度融合 +\end{lstlisting} + +这种融合趋势对设计领域意义深远:设计师可以用自然语言与视觉模型交互,用文字描述需求、用图像表达想法,AI能够同时理解两者并做出响应。 + + +\section{设计应用} + +\subsection{建筑检测与识别} + +利用目标检测和语义分割技术,可以从遥感图像和街景图像中自动提取建筑信息。 + +\textbf{应用场景}: + +\begin{lstlisting} +卫星/遥感图像输入 + │ + ▼ +┌──────────────────┐ +│ 建筑检测模型 │ → 建筑位置、边界框 +│ (YOLO/Faster R-CNN)│ +└────────┬─────────┘ + │ + ▼ +┌──────────────────┐ +│ 建筑分割模型 │ → 建筑轮廓、精确边界 +│ (U-Net/Mask R-CNN)│ +└────────┬─────────┘ + │ + ▼ +┌──────────────────┐ +│ 风格分类模型 │ → 建筑风格(现代/古典/...) +│ (ViT/CLIP) │ +└──────────────────┘ +\end{lstlisting} + +实际应用包括:城市建筑存量调查、历史街区建筑类型统计、违章建筑监测等。 + +\subsection{街景品质评估} + +街景图像(Street View Imagery)已成为城市设计分析的重要数据源。通过视觉模型可以从大规模街景中自动提取城市环境品质指标。 + +\textbf{典型分析指标}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +指标 & 定义 & 分析方法 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +绿视率 & 视野中绿色植被占比 & 语义分割:像素级统计 \\ +天空开敞度 & 视野中天空可见比例 & 语义分割:天空区域提取 \\ +建筑围合度 & 视野中建筑遮挡比例 & 语义分割+深度估计 \\ +街道活力 & 行人、车辆、商业活动密度 & 目标检测:计数+密度估计 \\ +景观丰富度 & 视觉元素多样性 & 分类/聚类:元素类型统计 \\ +\end{longtable} +} + +\begin{lstlisting} +街景图像 ──→ 语义分割 ──→ 各类像素统计 ──→ 品质指标计算 + │ + ├── 天空: 35% + ├── 建筑: 25% + ├── 道路: 15% + ├── 植被: 18% + ├── 车辆: 4% + └── 其他: 3% + +→ 绿视率 = 18% +→ 天空开敞度 = 35% +→ 建筑围合度 = 25% +\end{lstlisting} + +\subsection{设计素材理解与智能标注} + +利用CLIP等视觉-语言模型,可以实现设计素材的智能理解和管理: + +\begin{itemize} +\tightlist +\item + \textbf{智能标签}:自动为设计素材添加语义标签,无需人工标注 +\item + \textbf{自然语言检索}:用文字描述查找设计参考图(如''带玻璃幕墙的现代商业建筑'') +\item + \textbf{风格分类}:自动识别设计作品的风格特征 +\item + \textbf{相似推荐}:基于视觉语义相似度推荐相关素材 +\end{itemize} + +\subsection{风格分析与分类} + +建筑与设计的风格分析是视觉模型在设计领域的典型应用: + +\begin{lstlisting} +设计图像 → 特征提取 (ViT/DINOv2) → 风格特征向量 + │ + ┌─────────────────────┼─────────────────────┐ + │ │ │ + ▼ ▼ ▼ + 风格分类 风格聚类 风格检索 + (现代/古典/ (自动发现 (找到风格相似 + 后现代/...) 未知风格) 的设计案例) +\end{lstlisting} + +结合CLIP的零样本能力,设计师可以自定义风格类别(如''新中式''\,``极简主义''``有机建筑''等),无需收集训练数据即可进行风格分类。 + + +\section{本章小结} + +本章沿着\textbf{``CNN → 目标检测/语义分割 → Vision Transformer → 大视觉模型''}的技术演进主线,系统介绍了计算机视觉的核心方法和前沿进展。 + +\begin{lstlisting} +技术演进脉络 + +CNN时代 (2012-2020) Transformer时代 (2020-) +┌────────────────────┐ ┌────────────────────────┐ +│ AlexNet → VGG │ │ ViT: 图像=Patch序列 │ +│ → ResNet │ → │ Swin: 层级Transformer │ +│ 分类 / 检测 / 分割 │ │ │ +│ 任务专用模型 │ │ 大视觉模型: │ +└────────────────────┘ │ CLIP: 图文对齐 │ + │ SAM: 分割一切 │ + │ DINOv2: 自监督特征 │ + │ VLM: 视觉-语言融合 │ + └────────────────────────┘ +\end{lstlisting} + +关键趋势:模型从\textbf{任务专用}走向\textbf{通用基础},从\textbf{纯视觉}走向\textbf{视觉-语言融合},从\textbf{监督学习}走向\textbf{自监督和提示学习}。这些趋势正在为设计领域带来更强大、更灵活、更易用的视觉智能工具。 + + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \textbf{架构对比}:CNN通过局部卷积提取特征,ViT通过全局自注意力建立关系。在设计场景中(如建筑立面分析、街景品质评估),你认为哪种架构更适合?为什么? +\item + \textbf{零样本能力}:CLIP实现了''用自然语言做图像分类''的零样本能力。如果你是一名城市设计师,想用CLIP分析城市街景的''宜居性'',你会如何设计提示文本?考虑需要哪些视觉线索。 +\item + \textbf{大模型与传统方法}:SAM号称可以''分割一切''。在专业设计领域(如建筑精细构件识别、景观植物种类分割),通用大模型和针对特定任务训练的小模型各有什么优势和局限?你会如何选择? +\end{enumerate} + + +\section{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +卷积神经网络 & Convolutional Neural Network (CNN) & 利用卷积操作提取局部特征的神经网络 \\ +卷积核/滤波器 & Kernel / Filter & 卷积操作中用于特征提取的小矩阵 \\ +池化 & Pooling & 降低特征图空间尺寸的下采样操作 \\ +感受野 & Receptive Field & 神经元能''看到''的输入区域大小 \\ +残差连接 & Residual/Skip Connection & 将输入直接加到输出上,解决深层网络退化问题 \\ +目标检测 & Object Detection & 同时识别图像中目标的类别和位置 \\ +边界框 & Bounding Box & 用矩形框标出目标位置的表示方法 \\ +语义分割 & Semantic Segmentation & 对每个像素进行类别标签预测 \\ +实例分割 & Instance Segmentation & 区分同类别的不同个体实例 \\ +视觉Transformer & Vision Transformer (ViT) & 将图像切分为Patch序列,用Transformer处理 \\ +零样本学习 & Zero-shot Learning & 在未见过的类别上直接进行推理 \\ +对比学习 & Contrastive Learning & 通过对比正负样本学习特征表示 \\ +视觉-语言模型 & Vision-Language Model & 同时理解图像和文本的多模态模型 \\ +提示学习 & Prompt Learning & 通过自然语言提示引导模型完成特定任务 \\ +基础模型 & Foundation Model & 在大规模数据上预训练的通用模型 \\ +\end{longtable} +} diff --git a/chapters/ch05-3d-spatial.tex b/chapters/ch05-3d-spatial.tex new file mode 100644 index 0000000..8e7c4f1 --- /dev/null +++ b/chapters/ch05-3d-spatial.tex @@ -0,0 +1,1715 @@ +\chapter{三维数据——空间与3D} + +\section{篇章导读} + +三维数据是AI与物理世界之间最直接的桥梁。从建筑到城市规划,从景观到工业设计,空间理解始终是设计实践的核心能力。一架无人机飞过城市上空,激光雷达 (LiDAR) 每秒发射数十万束激光,返回的每一个点都在描述一个真实的空间坐标——这些点汇聚成点云,构成数字世界的三维基础。一个设计师用手机扫描房间,几秒钟后便得到完整的三维模型;一位规划师输入''现代化办公椅''的文本描述,AI便能生成一个可编辑的3D模型。 + +这些场景不再是科幻。从传统的多视图立体匹配 (MVS) 到神经辐射场 (NeRF),从三维高斯溅射 (3D Gaussian Splatting) 到大规模空间智能模型,三维AI正在经历从小模型到大模型、从感知到推理的范式跃迁。本章将带你走进三维数据的世界,理解AI如何''看见''和''重建''空间,并探索空间智能在设计领域的广阔应用。 + + +\section{三维数据表示} + +\section{学习目标} + +\begin{itemize} +\tightlist +\item + 理解四种主要3D数据表示形式的特点与适用场景 +\item + 掌握点云、网格、体素、深度图的区别与联系 +\item + 了解Open3D等工具的基本使用方法 +\end{itemize} + +\subsection{为什么需要多种3D表示} + +现实世界是三维的,但计算机需要用特定的数据结构来存储和处理3D信息。不同的表示方式在精度、内存效率和处理难度上各有权衡,选择合适的表示方式是3D AI的第一步。 + +\begin{lstlisting} +物理世界 + ↓ 采集/建模 +三维数据 ──→ 点云 (Point Cloud) + ──→ 网格 (Mesh) + ──→ 体素 (Voxel) + ──→ 深度图 (Depth Map) +\end{lstlisting} + +\subsection{点云 (Point Cloud)} + +\textbf{定义}:一组三维坐标点的集合,每个点包含 (x, y, z) 坐标,可选附加颜色 (r, g, b)、法向量等属性。 + +\begin{lstlisting} +点云示例: + ● ● + ● ● + ● ● ● + ● ● + ● ● + +每个点:P = (x, y, z) 或 (x, y, z, r, g, b) +\end{lstlisting} + +\textbf{特点}: + +\begin{itemize} +\tightlist +\item + 最接近原始传感器数据的表示形式 +\item + 不规则、无序、无拓扑关系 +\item + 点的数量可变(置换不变性问题) +\item + 适合大规模场景的快速采集 +\end{itemize} + +\textbf{常见来源}: + +\begin{itemize} +\tightlist +\item + 激光雷达 (LiDAR):自动驾驶、城市扫描 +\item + 深度相机 (RGB-D Camera):室内扫描、物体识别 +\item + 摄影测量 (Photogrammetry):无人机航拍重建 +\end{itemize} + +\subsection{网格 (Mesh)} + +\textbf{定义}:由顶点 (Vertices)、边 (Edges) 和面 (Faces) 组成的多面体表示,是最常见的3D模型格式。 + +\begin{lstlisting} +网格结构: + v₁ ──── v₂ + | \ | + | f₁ | + | \ | + v₃ ──── v₄ + +顶点:v₁, v₂, v₃, v₄ (各含 x, y, z 坐标) +面: f₁ = (v₁, v₂, v₃), f₂ = (v₂, v₃, v₄) 等 +\end{lstlisting} + +\textbf{特点}: + +\begin{itemize} +\tightlist +\item + 具有拓扑关系,能表示物体表面 +\item + 渲染效率高,是游戏、动画的标准格式 +\item + 文件格式:OBJ, STL, PLY, FBX 等 +\item + 适合设计建模和可视化 +\end{itemize} + +\subsection{体素 (Voxel)} + +\textbf{定义}:三维空间中的规则网格单元,是二维像素 (Pixel) 在三维空间的推广——``三维像素''。 + +\begin{lstlisting} +体素网格: + ┌───┬───┬───┐ + │ 1 │ 0 │ 1 │ 1 = 占据 + ├───┼───┼───┤ 0 = 空闲 + │ 0 │ 1 │ 0 │ + ├───┼───┼───┤ + │ 1 │ 1 │ 0 │ + └───┴───┴───┘ + +类似"我的世界"(Minecraft)的方块表示 +\end{lstlisting} + +\textbf{特点}: + +\begin{itemize} +\tightlist +\item + 规则网格结构,可直接使用3D卷积 +\item + 内存消耗与分辨率的立方成正比 +\item + 分辨率有限时存在''方块效应'' +\item + 适合3D卷积神经网络处理 +\end{itemize} + +\subsection{深度图 (Depth Map)} + +\textbf{定义}:二维图像,每个像素存储的是该位置到相机的距离(深度值),也称2.5D表示。 + +\begin{lstlisting} +深度图: + ┌─────┬─────┬─────┐ + │ 2.1 │ 2.3 │ 8.5 │ 数值 = 到相机的距离 + ├─────┼─────┼─────┤ (单位:米) + │ 2.0 │ 2.2 │ 9.1 │ + ├─────┼─────┼─────┤ + │ 2.2 │ 2.1 │ 8.8 │ + └─────┴─────┴─────┘ + +近处物体:深度值小 (2.0) +远处背景:深度值大 (9.1) +\end{lstlisting} + +\textbf{特点}: + +\begin{itemize} +\tightlist +\item + 本质是二维数组,处理效率高 +\item + 只包含单视角的深度信息(不完全的3D) +\item + 可直接与RGB图像对齐 +\item + 常见于深度相机(Kinect, RealSense)输出 +\end{itemize} + +\subsection{四种表示方式对比} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.0789}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2632}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1842}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1974}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2763}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +特性 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +点云 (Point Cloud) +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +网格 (Mesh) +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +体素 (Voxel) +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +深度图 (Depth Map) +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +数据结构 & 无序点集 & 顶点 + 面 & 规则3D网格 & 2D数组 \\ +内存效率 & 较高 & 高 & 低(立方增长) & 高 \\ +分辨率 & 灵活(点密度) & 可调(面数) & 受网格限制 & 受图像分辨率限制 \\ +拓扑信息 & 无 & 有 & 隐含 & 无 \\ +深度学习适配 & 需特殊处理 & 需转换 & 直接3D卷积 & 直接2D卷积 \\ +常见来源 & LiDAR, RGB-D & 建模软件 & 体素化转换 & 深度相机 \\ +典型应用 & 场景扫描 & 设计建模 & 3D语义分割 & 室内导航 \\ +\end{longtable} +} + +\subsection{代码实践:点云加载与可视化} + +以下示例使用 Open3D 库加载并可视化一个点云文件: + +\begin{lstlisting}[language=Python] +import open3d as o3d +import numpy as np + +# 创建一个示例点云(模拟简单的建筑体量) +pcd = o3d.geometry.PointCloud() + +# 生成一个"盒子"形状的点云 +points = [] +# 底面 +for x in np.linspace(0, 10, 50): + for y in np.linspace(0, 8, 40): + points.append([x, y, 0]) + points.append([x, y, 5]) # 顶面 +# 侧面 +for x in np.linspace(0, 10, 50): + for z in np.linspace(0, 5, 25): + points.append([x, 0, z]) + points.append([x, 8, z]) +for y in np.linspace(0, 8, 40): + for z in np.linspace(0, 5, 25): + points.append([0, y, z]) + points.append([10, y, z]) + +pcd.points = o3d.utility.Vector3dVector(np.array(points)) + +# 统计点云信息 +print(f"点云包含 {len(pcd.points)} 个点") +print(f"边界框: {pcd.get_min_bound()} ~ {pcd.get_max_bound()}") + +# 可视化 +o3d.visualization.draw_geometries( + [pcd], + window_name="建筑体量点云", + width=800, height=600, + point_show_normal=False +) +\end{lstlisting} + +加载真实点云文件(如 PLY 格式)只需一行: + +\begin{lstlisting}[language=Python] +pcd = o3d.io.read_point_cloud("building_scan.ply") +o3d.visualization.draw_geometries([pcd]) +\end{lstlisting} + +\subsection{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 为什么点云是无序的?这对深度学习模型设计有什么影响? +\item + 如果要表示一个室内场景,哪种3D表示方式最合适?为什么? +\item + 体素的内存消耗与分辨率的关系是什么?分辨率为256\^{}3时有多少个体素? +\end{enumerate} + +\subsection{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +中文 & 英文 & 说明 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +点云 & Point Cloud & 三维坐标点的集合 \\ +网格 & Mesh & 顶点、边、面组成的多面体表示 \\ +体素 & Voxel & 三维空间中的规则网格单元 \\ +深度图 & Depth Map & 存储距离信息的二维图像 \\ +激光雷达 & LiDAR & 激光测距传感器 \\ +法向量 & Normal Vector & 垂直于表面的方向向量 \\ +\end{longtable} +} + +\subsection{延伸阅读} + +\begin{itemize} +\tightlist +\item + \href{http://www.open3d.org/docs/}{Open3D 官方文档} +\item + \href{https://pointclouds.org/}{Point Cloud Library (PCL)} +\end{itemize} + + +\section{三维理解} + +\section{学习目标} + +\begin{itemize} +\tightlist +\item + 理解PointNet的核心创新:直接处理点云的置换不变性 +\item + 了解三维目标检测与分割的基本方法 +\item + 掌握3D理解在设计领域的典型应用场景 +\end{itemize} + +\subsection{小模型时代的3D理解} + +在Transformer等大模型出现之前,3D深度学习主要依赖专门设计的小型网络架构。核心挑战在于:三维数据不像图像那样具有规则的网格结构,无法直接使用标准卷积操作。 + +\begin{lstlisting} +3D理解的三个核心任务: + +输入: 三维数据 (点云/网格/体素/深度图) + ↓ + ├── 3D分类: "这是什么?" → 类别标签 + ├── 3D检测: "物体在哪?" → 3D边界框 + 类别 + └── 3D分割: "每个部分是什么?" → 逐点/逐体素标签 +\end{lstlisting} + +\subsection{PointNet (2017):直接处理点云} + +\subsubsection{核心问题} + +点云是无序集合。同样的点集,无论以什么顺序输入,输出应该相同——这就是\textbf{置换不变性} (Permutation Invariance)。 + +\begin{lstlisting} +同一个物体的点云,点的排列顺序不同: + +表示1: {P₁, P₂, P₃, ..., Pₙ} +表示2: {P₃, P₁, Pₙ, ..., P₂} ← 顺序不同 +表示3: {Pₙ, Pₙ₋₁, ..., P₁} ← 完全倒序 + +期望:f(表示1) = f(表示2) = f(表示3) +\end{lstlisting} + +\subsubsection{PointNet的解决方案} + +\begin{lstlisting} +输入点云: N × 3 (N个点,每个3个坐标) + ↓ +逐点MLP: 3 → 64 → 128 → 1024 (对每个点独立处理) + ↓ +对称函数: Max Pooling (取每个特征维度的最大值) + ↓ +全局特征: 1 × 1024 + ↓ +全连接层 → 分类/分割输出 + +关键: Max Pooling 天然满足置换不变性 + max(a, b, c) = max(c, a, b) = max(b, c, a) +\end{lstlisting} + +\subsubsection{PointNet架构简图} + +\begin{lstlisting} + 输入点云 T-Net MLP Max Pooling 全连接 + (N×3) → (空间变换换) → (64→128→1024) → (1×1024) → 输出 + ↑ ↑ + 对齐输入 全局特征向量 +\end{lstlisting} + +\textbf{T-Net}:学习一个空间变换矩阵,将输入点云对齐到规范姿态(类似空间归一化)。 + +\subsubsection{代码示例:理解PointNet的核心思想} + +\begin{lstlisting}[language=Python] +import torch +import torch.nn as nn + +class SimplePointNet(nn.Module): + """简化版PointNet,展示核心思想""" + def __init__(self, num_classes=10): + super().__init__() + # 逐点MLP:对每个点独立提取特征 + self.mlp = nn.Sequential( + nn.Linear(3, 64), + nn.ReLU(), + nn.Linear(64, 128), + nn.ReLU(), + nn.Linear(128, 1024) + ) + # 分类头 + self.classifier = nn.Sequential( + nn.Linear(1024, 512), + nn.ReLU(), + nn.Dropout(0.3), + nn.Linear(512, num_classes) + ) + + def forward(self, x): + # x: (batch_size, num_points, 3) + x = self.mlp(x) # (B, N, 1024) + x = torch.max(x, dim=1)[0] # (B, 1024) ← 对称函数! + x = self.classifier(x) # (B, num_classes) + return x + +# 测试置换不变性 +model = SimplePointNet(num_classes=5) +points = torch.randn(1, 100, 3) # 1个样本,100个点 + +# 原始顺序 +out1 = model(points) +# 随机打乱顺序 +perm = torch.randperm(100) +out2 = model(points[:, perm, :]) + +print(f"输出差异: {torch.max(torch.abs(out1 - out2)).item():.6f}") +# 输出差异应接近0 —— 置换不变性! +\end{lstlisting} + +\subsection{PointNet++:层次化点集学习} + +PointNet将所有点直接映射为全局特征,缺乏捕捉局部结构的能力。PointNet++引入了层次化 (Hierarchical) 结构: + +\begin{lstlisting} +PointNet: 所有点 ──→ 全局特征 (单层,无局部结构) + +PointNet++: 点集 → 局部区域1 → 局部区域2 → ... → 全局特征 + ↑ 每层都是一个小PointNet + ↑ 逐步扩大感受野 +\end{lstlisting} + +\begin{lstlisting} +层次化处理流程: + 输入: N个点 + ↓ 采样 + 分组 (Ball Query) + N个局部区域 (每个含K个点) + ↓ 对每个区域用 PointNet + N'个新的特征点 + ↓ 采样 + 分组 + 更少的局部区域 + ↓ 对每个区域用 PointNet + 全局特征 +\end{lstlisting} + +\textbf{核心改进}: + +\begin{itemize} +\tightlist +\item + \textbf{最远点采样 (Farthest Point Sampling)}:均匀选取中心点 +\item + \textbf{球查询 (Ball Query)}:查找半径范围内的邻域点 +\item + \textbf{多尺度分组 (MSG)}:不同半径捕捉不同尺度的局部特征 +\end{itemize} + +\subsection{基于体素的3D CNN} + +另一种思路是将不规则3D数据转换为规则网格,然后使用3D卷积: + +\begin{lstlisting} +点云/网格 + ↓ 体素化 (Voxelization) +规则体素网格 (如 32×32×32) + ↓ 3D卷积 +3D特征图 + ↓ 分类/检测/分割 + +2D卷积核: H × W (如 3×3) +3D卷积核: D × H × W (如 3×3×3) +\end{lstlisting} + +\textbf{优势}:可直接利用成熟的CNN框架 + +\textbf{劣势}:内存消耗大(分辨率立方增长)、量化损失 + +\subsection{三维目标检测与分割} + +\subsubsection{3D目标检测} + +\begin{lstlisting} +输入: 3D场景 (点云/体素) + ↓ +3D检测器 + ↓ +输出: 3D边界框 [(x, y, z, l, w, h, θ, class), ...] + 位置 长宽高 朝向 类别 +\end{lstlisting} + +代表性方法: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +方法 & 类型 & 特点 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +VoteNet (2019) & 点云投票 & 从点云直接预测3D框 \\ +PointPillars (2019) & 点云→伪图像 & 高效的激光雷达检测 \\ +VoxelNet (2018) & 体素化 & 端到端3D检测 \\ +CenterPoint (2021) & 中心点检测 & 以中心 heatmap 方式检测 \\ +\end{longtable} +} + +\subsubsection{3D语义分割} + +\begin{lstlisting} +室内场景点云 + ↓ 逐点分类 +[墙壁, 墙壁, 地板, 地板, 椅子, 椅子, 桌子, ...] + ↓ +每个点获得语义标签 +\end{lstlisting} + +\subsection{设计应用} + +\subsubsection{建筑足迹提取} + +\begin{lstlisting} +无人机激光扫描 + ↓ +3D点云数据 + ↓ PointNet++ / 语义分割 +地面点 | 建筑点 | 植被点 + ↓ +建筑足迹向量 (可导入GIS/CAD) +\end{lstlisting} + +\subsubsection{地形分类} + +\begin{lstlisting} +LiDAR地形扫描 + ↓ 3D语义分割 +分类结果: [裸地, 草地, 灌木, 林地, 水体, 道路] + ↓ +用于景观规划、生态评估 +\end{lstlisting} + +\subsubsection{室内场景理解} + +\begin{lstlisting} +深度相机扫描 + ↓ 3D实例分割 +[墙1, 墙2, 地板, 天花板, 沙发, 桌子, 椅子1, 椅子2] + ↓ +自动生成室内平面图和家具布局 +\end{lstlisting} + +\subsection{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + PointNet的Max Pooling为什么能满足置换不变性?除了Max Pooling,还有哪些对称函数? +\item + 体素表示为什么内存消耗大?如果场景中有大量空白区域,如何优化? +\item + 设计一个用PointNet对建筑风格进行分类的方案,需要哪些数据和步骤? +\end{enumerate} + +\subsection{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +中文 & 英文 & 说明 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +置换不变性 & Permutation Invariance & 输入顺序不影响输出 \\ +对称函数 & Symmetric Function & 对输入顺序不敏感的函数 \\ +最远点采样 & Farthest Point Sampling & 均匀选取代表点 \\ +球查询 & Ball Query & 查找半径内的邻域点 \\ +3D边界框 & 3D Bounding Box & 三维空间中的矩形框 \\ +体素化 & Voxelization & 将不规则数据转为规则体素 \\ +\end{longtable} +} + +\subsection{延伸阅读} + +\begin{itemize} +\tightlist +\item + \href{https://arxiv.org/abs/1612.00593}{PointNet: Deep Learning on Point Sets (Qi et al., 2017)} +\item + \href{https://arxiv.org/abs/1706.02413}{PointNet++: Deep Hierarchical Feature Learning (Qi et al., 2017)} +\end{itemize} + + +\section{三维重建与生成} + +\section{学习目标} + +\begin{itemize} +\tightlist +\item + 理解传统3D重建方法(SfM、MVS)的基本原理 +\item + 掌握NeRF和3D Gaussian Splatting的核心思想 +\item + 了解Text-to-3D和Image-to-3D生成模型的发展 +\end{itemize} + +\subsection{从传统方法到神经渲染} + +三维重建是从2D图像或传感器数据中恢复3D场景的过程。从传统几何方法到深度学习驱动的方法,这一领域经历了革命性的变化。 + +\begin{lstlisting} +3D重建方法演进: + +传统几何方法 (2000s) + SfM → MVS → 稠密点云 + ↓ +深度学习增强 (2015+) + 学习型MVS → 更鲁棒的重建 + ↓ +神经渲染 (2020) + NeRF: 神经网络隐式表示场景 + ↓ +显式表示复兴 (2023) + 3D Gaussian Splatting: 高效实时渲染 + ↓ +3D大模型生成 (2023+) + Text-to-3D / Image-to-3D +\end{lstlisting} + +\subsection{传统方法} + +\subsubsection{Structure from Motion (SfM,运动恢复结构)} + +\textbf{核心思想}:从一系列不同角度拍摄的2D照片中,同时恢复相机的位置 (运动) 和场景的3D结构。 + +\begin{lstlisting} +SfM流程: + 多张照片 (不同角度) + ↓ 特征提取与匹配 + 特征对应关系 + ↓ 几何约束求解 + 相机位姿 (位置+朝向) + ↓ 三角测量 + 稀疏3D点云 +\end{lstlisting} + +\begin{lstlisting} +相机1 场景点P 相机2 + ○ ──────── x ←───────→ x ────────── ○ + 光线1 光线2 + ╲ ╱ + ╲ ╱ + ╲ 交点= ╱ + ╲ P的3D ╱ + 位置 ╱ +\end{lstlisting} + +\textbf{关键步骤}: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + \textbf{特征检测}:SIFT/SUPERPOINT等算法检测每张图片的关键特征 +\item + \textbf{特征匹配}:在不同图片之间找到相同的特征点 +\item + \textbf{运动估计}:根据匹配关系计算相机运动 +\item + \textbf{三角测量}:利用两个视角的射线交汇得到3D坐标 +\end{enumerate} + +\subsubsection{Multi-View Stereo (MVS,多视图立体匹配)} + +SfM只产生稀疏点云,MVS则在此基础上生成稠密重建: + +\begin{lstlisting} +SfM稀疏点云 + ↓ +MVS稠密匹配 + ↓ +稠密点云 / 深度图 + ↓ +表面重建 (Poisson, Delaunay) + ↓ +完整3D网格模型 +\end{lstlisting} + +\textbf{局限性}: + +\begin{itemize} +\tightlist +\item + 对纹理缺乏区域(白墙、玻璃)重建效果差 +\item + 计算耗时较长 +\item + 难以处理反光、透明材质 +\end{itemize} + +\subsection{NeRF (Neural Radiance Fields,神经辐射场)} + +2020年,加州大学伯克利分校的研究团队提出了NeRF,彻底改变了3D重建的范式。 + +\subsubsection{核心思想} + +不再显式存储3D模型(点云/网格),而是用一个神经网络来''记住''整个三维场景: + +\begin{lstlisting} +传统: 场景 → 存储为点云/网格/体素 +NeRF: 场景 → 训练一个神经网络 + +网络输入: (x, y, z, θ, φ) + 3D坐标 观察方向 +网络输出: (r, g, b, σ) + 颜色 密度 +\end{lstlisting} + +\begin{lstlisting} + ┌──────────────────┐ +(x,y,z,θ,φ) ────→ │ MLP │ ────→ (r, g, b) + 空间位置+视角 │ (8-12层, 256宽) │ + │ │ ────→ σ (密度) + └──────────────────┘ + +σ 控制该点是否"有物体": + σ ≈ 0 → 空气(光线直接穿过) + σ ≈ 大 → 实体(光线被吸收/着色) +\end{lstlisting} + +\subsubsection{体渲染 (Volume Rendering)} + +NeRF通过体渲染将3D神经场合成为2D图像: + +\begin{lstlisting} +对于图像上的每个像素: + ↓ +从相机发射一条光线穿过场景 + ↓ +沿光线采样多个3D点 + ↓ +对每个点查询NeRF网络得到(颜色, 密度) + ↓ +沿光线积分 → 像素颜色 + +C(r) = ∫ T(t) · σ(t) · c(t) dt + +其中 T(t) = exp(-∫ σ(s) ds) 是透射率 +\end{lstlisting} + +直观理解: + +\begin{lstlisting} +相机 ──光线──→ ●密度高(墙) ──→ ●密度低(窗) ──→ ●密度高(树) + 颜色=灰色 颜色=透明 颜色=绿色 + ↓ ↓ ↓ + 最终权重=高 权重=低 权重=中 + ↓ + 最终像素颜色 = 加权混合 +\end{lstlisting} + +\subsubsection{训练过程} + +\begin{lstlisting} +输入: 多张不同角度的照片 + 相机参数 + ↓ +对每张照片的每个像素: + 1. 发射光线 + 2. 采样3D点,查询MLP + 3. 体渲染得到预测颜色 + ↓ +计算损失: L = ||预测颜色 - 真实像素颜色||² + ↓ +反向传播,更新MLP权重 + ↓ +重复数万次 → MLP"记住"了整个场景 +\end{lstlisting} + +\subsubsection{NeRF的优势与局限} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}ll@{}} +\toprule\noalign{} +优势 & 局限 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +重建质量极高 & 训练慢(数小时/场景) \\ +能处理复杂光照 & 渲染慢(逐光线查询MLP) \\ +连续表示,无分辨率限制 & 难以编辑/修改 \\ +不需要网格/纹理等显式表示 & 泛化能力有限(每场景训练) \\ +\end{longtable} +} + +\subsection{3D Gaussian Splatting (三维高斯溅射, 2023)} + +NeRF的隐式表示虽然质量高,但速度慢、难以编辑。3D Gaussian Splatting (3DGS) 用显式的高斯椭球体取代了隐式神经网络,实现了实时渲染。 + +\subsubsection{核心思想} + +场景由大量3D高斯椭球体组成,每个高斯体具有: + +\begin{lstlisting} +一个3D高斯体的属性: + - 位置 μ = (x, y, z) ← 在哪 + - 协方差 Σ (旋转+缩放) ← 形状 + - 不透明度 α ← 透明度 + - 球谐系数 SH ← 颜色(依赖视角) + +数学表示: + G(x) = exp(-½(x-μ)ᵀ Σ⁻¹ (x-μ)) +\end{lstlisting} + +\begin{lstlisting} +场景表示: + ● = 高斯体1 (椭圆,浅蓝,半透明) + ● = 高斯体2 (圆形,深蓝,不透明) + ● = 高斯体3 (扁平,白色,透明) + ● = ... + 成千上万个高斯体叠加 → 完整场景 +\end{lstlisting} + +\subsubsection{Splatting(溅射)过程} + +\begin{lstlisting} +3D高斯体 → 投影到2D图像平面 → 排序 → 混合 → 最终图像 + +名称由来: 像把"颜料"溅射 (Splat) 到画布上 +\end{lstlisting} + +\begin{lstlisting} + 3D空间 2D图像 + ● ● ● ┌─────────┐ + ● ● ● ● ● 投影→ │ 渲染结果 │ + ● ● ● │ (实时) │ + ● ● └─────────┘ + +3D高斯体 ──→ 2D椭圆 ──→ 按深度排序 ──→ Alpha混合 +\end{lstlisting} + +\subsubsection{3DGS vs NeRF}\label{dgs-vs-nerf} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +特性 & NeRF & 3D Gaussian Splatting \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +场景表示 & 隐式 (MLP权重) & 显式 (高斯体集合) \\ +训练时间 & 数小时 & 数分钟到数十分钟 \\ +渲染速度 & 慢(逐点查询) & 实时(\textgreater100 FPS) \\ +渲染质量 & 高 & 高(相当或更好) \\ +可编辑性 & 困难 & 可以操作高斯体 \\ +存储 & 小(网络权重) & 较大(百万高斯体) \\ +\end{longtable} +} + +\subsection{3D生成模型} + +从2023年开始,AI不仅能''重建''已有场景,还能从零''生成''新的3D内容。 + +\subsubsection{Text-to-3D (文本生成3D)} + +\begin{lstlisting} +文本描述 → 3D生成模型 → 3D模型 + +示例: +"a modern office chair with armrests" + → 可编辑的3D办公椅模型 + +"a traditional Chinese pavilion" + → 中国古亭的3D模型 +\end{lstlisting} + +\subsubsection{Image-to-3D (图像生成3D)} + +\begin{lstlisting} +单张照片 → 3D生成模型 → 3D模型 + +示例: +一张建筑立面照片 → 完整的3D建筑模型 +一张产品照片 → 360°可旋转的3D模型 +\end{lstlisting} + +\subsubsection{代表性方法} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lllll@{}} +\toprule\noalign{} +模型 & 年份 & 输入 & 方法 & 特点 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +DreamFusion & 2022 & 文本 & SDS + NeRF & 首个高质量Text-to-3D \\ +Point-E & 2022 & 文本 & 扩散模型→点云 & 速度快,质量一般 \\ +Shap-E & 2023 & 文本/图像 & 扩散模型→隐式函数 & 支持3D和纹理 \\ +LRM & 2023 & 图像 & Transformer & 大规模重建模型 \\ +TripoSR & 2024 & 图像 & Transformer+NeRF & 开源,快速单图重建 \\ +CLAY & 2024 & 文本 & 大型3D原生模型 & 设计级3D生成 \\ +Trellis & 2024 & 文本/图像 & 结构化隐式+高斯 & 高质量,可编辑 \\ +\end{longtable} +} + +\subsubsection{DreamFusion的SDS原理 (Score Distillation Sampling)} + +DreamFusion的核心创新在于:利用预训练的2D扩散模型来指导3D生成。 + +\begin{lstlisting} +思路: + 2D扩散模型懂得"什么图像是合理的" + → 让它来"指导"3D模型的渲染结果 + + 随机初始化的NeRF + ↓ 渲染为2D图像 + 2D扩散模型评估并给出梯度 + ↓ 更新NeRF参数 + 反复迭代 + ↓ + NeRF渲染出的图像越来越好 + → NeRF本身就是一个好的3D模型 +\end{lstlisting} + +\subsection{代码示例:简化版NeRF概念实现} + +以下代码展示NeRF的核心组件——一个将3D坐标和观察方向映射为颜色和密度的MLP: + +\begin{lstlisting}[language=Python] +import torch +import torch.nn as nn + +class SimpleNeRF(nn.Module): + """简化版NeRF,展示核心映射思想""" + def __init__(self, pos_dim=3, dir_dim=3, hidden=64): + super().__init__() + # 位置编码 (Positional Encoding) 提升高频细节 + self.pos_encode_freq = 6 # 编码频率数 + + # 编码后的维度: 3 × 2 × 6 = 36 (sin+cos, 6个频率) + encoded_pos_dim = pos_dim * 2 * self.pos_encode_freq + + # 主干网络: 处理空间位置 + self.backbone = nn.Sequential( + nn.Linear(encoded_pos_dim, hidden), + nn.ReLU(), + nn.Linear(hidden, hidden), + nn.ReLU(), + nn.Linear(hidden, hidden), + nn.ReLU(), + ) + # 密度分支: 从位置预测密度 + self.density_head = nn.Linear(hidden, 1) + # 颜色分支: 从位置+方向预测颜色 + self.color_head = nn.Sequential( + nn.Linear(hidden + dir_dim, hidden // 2), + nn.ReLU(), + nn.Linear(hidden // 2, 3), + nn.Sigmoid() # 颜色值在[0,1] + ) + + def positional_encoding(self, x): + """位置编码: 让MLP能学习高频细节""" + encoded = [] + for freq in range(self.pos_encode_freq): + for fn in [torch.sin, torch.cos]: + encoded.append(fn(2**freq * x)) + return torch.cat(encoded, dim=-1) + + def forward(self, positions, directions): + """ + positions: (B, 3) - 3D空间坐标 + directions: (B, 3) - 观察方向 + """ + # 位置编码 + encoded_pos = self.positional_encoding(positions) + # 提取特征 + features = self.backbone(encoded_pos) + # 预测密度 + density = self.density_head(features) # (B, 1) + # 预测颜色 (依赖位置和观察方向) + color = self.color_head( + torch.cat([features, directions], dim=-1) + ) # (B, 3) + return color, density + + +# 演示: 查询一个空间点的颜色和密度 +model = SimpleNeRF() +pos = torch.randn(100, 3) # 100个空间点 +dir = torch.randn(100, 3) # 100个观察方向 +dir = dir / dir.norm(dim=-1, keepdim=True) # 归一化方向 + +color, density = model(pos, dir) +print(f"颜色范围: [{color.min():.3f}, {color.max():.3f}]") +print(f"密度范围: [{density.min():.3f}, {density.max():.3f}]") +print(f"颜色形状: {color.shape}, 密度形状: {density.shape}") +\end{lstlisting} + +\subsection{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + NeRF中位置编码 (Positional Encoding) 的作用是什么?没有它会发生什么? +\item + 3D Gaussian Splatting 为什么比NeRF渲染速度快?从数据结构的角度分析。 +\item + 如果要为一个建筑外观设计项目选择3D重建方案,你会选择NeRF还是3DGS?为什么? +\end{enumerate} + +\subsection{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +神经辐射场 & NeRF & 用MLP隐式表示3D场景 \\ +体渲染 & Volume Rendering & 沿光线积分合成图像 \\ +三维高斯溅射 & 3D Gaussian Splatting & 用高斯椭球体显式表示场景 \\ +运动恢复结构 & Structure from Motion (SfM) & 从照片恢复3D结构和相机位姿 \\ +多视图立体匹配 & Multi-View Stereo (MVS) & 从多视角生成稠密3D重建 \\ +位置编码 & Positional Encoding & 用三角函数提升高频细节表达 \\ +\end{longtable} +} + +\subsection{延伸阅读} + +\begin{itemize} +\tightlist +\item + \href{https://arxiv.org/abs/2003.08934}{NeRF: Representing Scenes as Neural Radiance Fields (Mildenhall et al., 2020)} +\item + \href{https://arxiv.org/abs/2308.04079}{3D Gaussian Splatting for Real-Time Radiance Field Rendering (Kerbl et al., 2023)} +\item + \href{https://arxiv.org/abs/2209.14988}{DreamFusion: Text-to-3D using 2D Diffusion (Poole et al., 2022)} +\end{itemize} + + +\section{空间智能} + +\section{学习目标} + +\begin{itemize} +\tightlist +\item + 理解空间智能的概念及其对设计领域的意义 +\item + 了解多模态空间推理和场景理解的前沿方向 +\item + 掌握数字孪生的四个演进层次 +\item + 认识GIS+AI的融合趋势 +\end{itemize} + +\subsection{从3D感知到空间推理} + +前两节我们学习了AI如何''感知''和''重建''三维世界。空间智能 (Spatial Intelligence) 则更进一步——不仅要感知空间,还要理解和推理空间中的关系、规律与语义。 + +\begin{lstlisting} +3D能力层次: + +感知层: 识别物体和几何形状 + ↓ +理解层: 理解空间语义(这是什么空间?功能是什么?) + ↓ +推理层: 空间关系推理(A在B的左边,C挡住了D的视线) + ↓ +规划层: 基于空间理解进行决策和设计 +\end{lstlisting} + +\textbf{为什么空间智能对设计至关重要?} + +设计本质上是空间思维的活动——建筑师需要理解空间的比例与流线,景观设计师需要分析地形与视廊,城市规划师需要把握城市形态与功能关系。AI如果能够理解空间,就能成为设计过程中的真正协作伙伴。 + +\subsection{多模态空间推理} + +\subsubsection{概念} + +将视觉信息、语言描述和三维空间理解结合起来,进行空间相关的推理和问答。 + +\begin{lstlisting} +输入: 一张室内照片 + 问题 "沙发后面是什么?" + ↓ 多模态空间推理 +输出: "沙发后面是一面挂画的白墙" +\end{lstlisting} + +\begin{lstlisting} +多模态空间推理框架: + + 视觉模态 ──→ 视觉编码器 ──┐ + ├──→ 空间推理模块 ──→ 回答/决策 + 语言模态 ──→ 语言编码器 ──┤ + │ + 3D模态 ──→ 3D编码器 ──┘ + (点云/网格) +\end{lstlisting} + +\subsubsection{空间推理任务类型} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}llll@{}} +\toprule\noalign{} +任务 & 输入 & 输出 & 示例 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +空间问答 (Spatial QA) & 图像 + 问题 & 文字答案 & ``这栋建筑有几层?'' \\ +空间关系描述 & 3D场景 & 关系三元组 & (树, 在\ldots 前面, 建筑) \\ +导航指令 & 语言指令 & 路径/动作 & ``走到窗边左转'' \\ +场景变化检测 & 两个时刻的场景 & 变化描述 & ``左侧新增了一棵树'' \\ +\end{longtable} +} + +\subsection{场景理解} + +场景理解是对一个完整空间的多层次分析: + +\begin{lstlisting} +场景理解三层次: + + 语义理解 (Semantic) + ┌─────────────────────────────────────────────┐ + │ 这是什么?每个部分的功能是什么? │ + │ "这是客厅" "那是厨房" "这是走廊" │ + └─────────────────────────────────────────────┘ + + 几何理解 (Geometric) + ┌─────────────────────────────────────────────┐ + │ 空间的几何属性是什么? │ + │ 面积、高度、距离、角度、曲率 │ + └─────────────────────────────────────────────┘ + + 关系理解 (Relational) + ┌─────────────────────────────────────────────┐ + │ 物体之间的关系是什么? │ + │ A在B的上方、C连接D、E包围F │ + └─────────────────────────────────────────────┘ +\end{lstlisting} + +\subsubsection{具体任务} + +\begin{itemize} +\tightlist +\item + \textbf{语义分割}:每个区域的功能标注(居住、商业、绿地\ldots) +\item + \textbf{布局估计}:房间的结构(墙壁、门窗位置) +\item + \textbf{物体关系图}:构建场景中物体之间的空间关系图 +\end{itemize} + +\begin{lstlisting} +场景图 (Scene Graph): + + [桌子] ──在上面──→ [电脑] + │ │ + 在旁边 连接到 + ↓ ↓ + [椅子] [显示器] + │ + 在下面 + ↓ + [地毯] +\end{lstlisting} + +\subsection{大型空间模型} + +大型空间模型 (Large Spatial Models) 是一个新兴研究方向,旨在将大语言模型的推理能力与空间数据相结合。 + +\begin{lstlisting} +大语言模型 (LLM): 擅长语言理解与推理 + + +空间数据/模型: 擅长空间感知与几何计算 + ↓ +大型空间模型: 能理解和推理空间信息 + +类比: + LLM 是"能说话的大脑" + 视觉模型是"能看的眼睛" + 大型空间模型是"能理解空间的身体" +\end{lstlisting} + +\subsubsection{代表性工作} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +方向 & 代表工作 & 描述 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +3D-LLM & 3D-LLM (2023) & 将3D场景编码后输入LLM进行推理 \\ +空间问答 & SQA3D (2023) & 基于3D场景的问答基准 \\ +具身导航 & CLIPORT (2022) & 语言指导的机器人操作 \\ +场景生成 & SceneCraft (2024) & LLM驱动的场景布局生成 \\ +\end{longtable} +} + +\subsection{GIS + AI:智能地理分析} + +地理信息系统 (Geographic Information System, GIS) 是空间设计的核心工具。AI正在重塑GIS的分析能力。 + +\begin{lstlisting} +传统GIS: + 数据采集 → 存储 → 可视化 → 人工分析 + +AI增强GIS: + 数据采集 → 自动标注 → 智能分析 → 预测模拟 → 决策支持 + ↑ ↑ ↑ + 深度学习 空间推理 时空预测 +\end{lstlisting} + +\subsubsection{AI+GIS的典型应用} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +应用场景 & AI技术 & 设计意义 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +地物分类 & 语义分割 & 自动提取建筑、道路、水体 \\ +城市形态分析 & 深度学习 & 自动识别街区类型和肌理 \\ +地形分析 & 点云分割 & 坡度、坡向、汇水分析 \\ +变化检测 & 孪生网络 & 监测城市扩张和土地利用变化 \\ +选址分析 & 多因子评价 & AI辅助最优选址决策 \\ +交通模拟 & 图神经网络 & 预测交通流量和拥堵 \\ +\end{longtable} +} + +\subsection{数字孪生的演进} + +数字孪生 (Digital Twin) 是空间智能的终极目标——在数字世界中完整复制物理空间。 + +\begin{lstlisting} +数字孪生的四个层次: + +1. 几何孪生 (Geometric Twin) + ┌───────────────────────────────────┐ + │ 精确的3D几何模型 │ + │ 例: 建筑BIM模型、城市3D白模 │ + │ 静态的形状与空间关系 │ + └───────────────────────────────────┘ + ↓ + +2. 物理孪生 (Physical Twin) + ┌───────────────────────────────────┐ + │ 叠加物理属性与仿真 │ + │ 例: 结构力学模拟、日照分析 │ + │ 可以模拟物理过程 │ + └───────────────────────────────────┘ + ↓ + +3. 行为孪生 (Behavioral Twin) + ┌───────────────────────────────────┐ + │ 实时数据驱动的动态模型 │ + │ 例: 实时人流监测、能耗数据 │ + │ 反映当前状态和行为模式 │ + └───────────────────────────────────┘ + ↓ + +4. 认知孪生 (Cognitive Twin) + ┌───────────────────────────────────┐ + │ 具备推理和决策能力 │ + │ 例: AI分析异常、推荐优化方案 │ + │ 能"思考"和"建议" │ + └───────────────────────────────────┘ +\end{lstlisting} + +\subsubsection{设计领域的数字孪生案例} + +\begin{itemize} +\tightlist +\item + \textbf{建筑数字孪生}:从BIM模型到实时运维管理,结合IoT传感器数据监测建筑健康状态 +\item + \textbf{城市数字孪生}:新加坡Virtual Singapore项目,完整的城市级数字孪生平台 +\item + \textbf{景观数字孪生}:结合生态模型模拟植被生长、水文过程、生物多样性 +\end{itemize} + +\subsection{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 空间智能与2D图像理解的核心区别是什么?为什么空间推理需要三维信息? +\item + 数字孪生的四个层次在设计实践中分别对应哪些具体工具和方法? +\item + 设想一个''认知孪生''校园,它能做哪些事情?需要哪些技术支撑? +\end{enumerate} + +\subsection{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +中文 & 英文 & 说明 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +空间智能 & Spatial Intelligence & 理解和推理空间关系的能力 \\ +多模态推理 & Multi-modal Reasoning & 融合多种信息模态进行推理 \\ +场景图 & Scene Graph & 描述物体间关系的图结构 \\ +大型空间模型 & Large Spatial Model & 结合LLM与空间数据的模型 \\ +数字孪生 & Digital Twin & 物理空间的数字副本 \\ +地理信息系统 & GIS & 地理空间数据管理系统 \\ +\end{longtable} +} + +\subsection{延伸阅读} + +\begin{itemize} +\tightlist +\item + \href{https://arxiv.org/abs/2307.12981}{3D-LLM: Injecting 3D World into LLMs (Hong et al., 2023)} +\item + \href{https://arxiv.org/abs/2305.14086}{SQA3D: Situated Question Answering in 3D Scenes (Ma et al., 2023)} +\item + \href{https://learn.microsoft.com/en-us/azure/digital-twins/}{Microsoft Digital Twins} +\end{itemize} + + +\section{设计应用} + +\section{学习目标} + +\begin{itemize} +\tightlist +\item + 了解3D AI在建筑设计、景观设计、城市设计等领域的综合应用 +\item + 理解从数据采集到设计迭代的完整工作流 +\item + 掌握实际项目中3D技术的选型思路 +\end{itemize} + +\subsection{建筑:从概念到三维模型} + +\subsubsection{概念草图到3D模型} + +\begin{lstlisting} +设计师手绘草图 + ↓ AI理解 (2D → 3D) +3D概念体量模型 + ↓ 参数化调整 +优化方案 + ↓ BIM生成 +完整建筑信息模型 +\end{lstlisting} + +\textbf{关键技术}: + +\begin{itemize} +\tightlist +\item + 草图理解:深度学习识别建筑平面图中的墙体、门窗、空间 +\item + 3D生成:Image-to-3D模型将草图转化为体量模型 +\item + 参数化设计:AI根据设计约束(面积、高度、朝向)自动调整参数 +\end{itemize} + +\subsubsection{自动化BIM生成} + +\begin{lstlisting} +无人机扫描既有建筑 + ↓ 3D重建 (NeRF/3DGS) +点云/网格模型 + ↓ 语义分割 +识别: 墙体、楼板、梁柱、门窗 + ↓ 自动建模 +Revit/ArchiCAD BIM模型 + ↓ 工程应用 +结构分析 / 能耗模拟 / 施工管理 +\end{lstlisting} + +\subsubsection{设计迭代辅助} + +\begin{lstlisting} +设计约束: 面积≥500m², 层数≤6, 日照≥2h/天 + ↓ +AI生成多个满足约束的体量方案 + ↓ +设计师选择并微调 + ↓ +AI实时反馈: 容积率、日照、风环境 +\end{lstlisting} + +\subsection{景观:从地形到生态} + +\subsubsection{地形分析} + +\begin{lstlisting} +无人机航拍 + ↓ 摄影测量 / LiDAR +DEM (数字高程模型) + ↓ AI地形分析 + ├── 坡度分级图 + ├── 坡向分析图 + ├── 汇水流域图 + └── 视域分析图 +\end{lstlisting} + +\subsubsection{植被模拟} + +\begin{lstlisting} +当前场地点云 + ↓ 3D语义分割 +识别现有植被(树种、冠幅、高度) + ↓ 生长模型 + AI预测 +模拟5年/10年/20年后的植被状态 + ↓ +辅助种植设计决策 +\end{lstlisting} + +\subsubsection{视廊分析} + +\begin{lstlisting} +3D城市模型 + 观察点 + ↓ 视线追踪算法 +计算每个区域的可见度 + ↓ 生成视域图 (Viewshed) + ├── 确定最佳观景点 + ├── 保护重要景观视廊 + └── 评估新建建筑对景观的影响 +\end{lstlisting} + +\subsection{城市设计:数字孪生城市} + +\subsubsection{从无人机航拍到3D城市模型} + +\textbf{完整工作流案例}: + +\begin{lstlisting} +Step 1: 数据采集 + 无人机搭载相机/LiDAR + 覆盖1km²区域,重叠率70%+ + ↓ + +Step 2: 3D重建 + 照片 → SfM → 稀疏点云 + → MVS → 稠密点云 + → 网格重建 → 纹理映射 + 或: 照片 → 3DGS → 实时渲染场景 + ↓ + +Step 3: 语义理解 + 点云/网格 → 3D语义分割 + 识别: 建筑、道路、植被、水体、地面 + ↓ + +Step 4: 城市分析 + ├── 城市形态: 建筑密度、高度分布、街区肌理 + ├── 开放空间: 绿地可达性、公共空间品质 + ├── 交通网络: 道路连通性、步行友好度 + └── 微气候: 日照、风环境、热岛效应 + ↓ + +Step 5: 决策支持 + 方案对比模拟 → 可视化呈现 → 辅助规划决策 +\end{lstlisting} + +\subsubsection{城市形态分析} + +\begin{lstlisting} +3D城市模型 + ↓ AI自动提取 +建筑轮廓 + 高度 + 功能 + ↓ 形态学分析 + ├── 街道宽高比 (D/H) + ├── 建筑密度 (FAR) + ├── 天际线分析 + └── 街区类型分类 + ↓ +城市设计导则制定 +\end{lstlisting} + +\subsection{室内设计:从扫描到设计} + +\subsubsection{室内设计全流程} + +\begin{lstlisting} +Step 1: 房间扫描 + 手机/深度相机扫描 + ↓ + 实时3D重建 (如 LiDAR iPad/iPhone) + ↓ + 完整室内点云/网格 + ↓ + +Step 2: 场景理解 + 3D语义分割 + ↓ + 识别: 墙壁、地面、天花板、门窗、现有家具 + ↓ + 自动生成户型图 + 尺寸标注 + ↓ + +Step 3: 设计生成 + 输入: 户型图 + 风格偏好 + 预算 + ↓ AI辅助 + 生成多个布局方案 (2D + 3D) + ↓ + 材质搭配 + 灯光设计 + ↓ + +Step 4: 可视化与迭代 + 实时3D渲染 / VR预览 + ↓ + 设计师/客户反馈 → AI调整 + ↓ + 最终方案 +\end{lstlisting} + +\subsection{工业设计:逆向工程与再设计} + +\subsubsection{产品扫描到再设计} + +\begin{lstlisting} +现有产品 (如: 经典椅子) + ↓ 3D扫描 (结构光/激光) +高精度点云/网格 + ↓ + ├── 逆向工程: 提取设计参数 + │ 曲面分析、人机工程参数 + │ + ├── 缺陷检测: 识别磨损/变形区域 + │ 为改良设计提供依据 + │ + └── AI再设计: 基于原始形态生成变体 + "保留经典轮廓,增加人体工学支撑" +\end{lstlisting} + +\begin{lstlisting} +3D扫描模型 + ↓ AI分析 +特征提取 (曲率、对称性、风格特征) + ↓ 参数化表示 + ↓ 生成式设计 +新的变体方案 + ↓ + ├── 拓扑优化 (减重、增强) + ├── 可制造性分析 (3D打印/CNC) + └── 风格迁移 (保留功能,改变风格) +\end{lstlisting} + +\subsection{综合案例:从无人机航测到3D城市模型} + +以下代码展示一个简化但完整的城市3D重建工作流: + +\begin{lstlisting}[language=Python] +import open3d as o3d +import numpy as np + +# ===== Step 1: 加载无人机航测生成的点云 ===== +# 实际项目中由COLMAP/OpenMVS/Pix4D等工具从照片生成 +pcd = o3d.io.read_point_cloud("aerial_survey.ply") + +# ===== Step 2: 点云预处理 ===== +# 下采样 (减少点数,保留结构) +pcd_down = pcd.voxel_down_sample(voxel_size=0.05) + +# 去除噪声点 (统计滤波) +pcd_clean, _ = pcd_down.remove_statistical_outlier( + nb_neighbors=20, std_ratio=2.0 +) + +# 估计法向量 +pcd_clean.estimate_normals( + search_param=o3d.geometry.KDTreeSearchParamHybrid( + radius=0.1, max_nn=30 + ) +) + +print(f"处理后点数: {len(pcd_clean.points)}") + +# ===== Step 3: 地面分割 (简化版) ===== +points = np.asarray(pcd_clean.points) + +# 用高度阈值简单分割(实际项目用CSF等算法) +min_z = points[:, 2].min() +ground_mask = points[:, 2] < min_z + 0.5 # 地面点 +building_mask = points[:, 2] >= min_z + 1.5 # 建筑点 + +ground_pcd = pcd_clean.select_by_index( + np.where(ground_mask)[0] +) +building_pcd = pcd_clean.select_by_index( + np.where(building_mask)[0] +) + +# 给不同类别上色 +ground_pcd.paint_uniform_color([0.6, 0.8, 0.6]) # 绿色=地面 +building_pcd.paint_uniform_color([0.7, 0.7, 0.9]) # 蓝色=建筑 + +# ===== Step 4: 可视化 ===== +o3d.visualization.draw_geometries( + [ground_pcd, building_pcd], + window_name="城市3D模型 - 地面(绿)+建筑(蓝)", + width=1200, height=800 +) + +# ===== Step 5: 基础分析 ===== +print(f"\n===== 场景分析 =====") +print(f"地面点: {np.sum(ground_mask)}") +print(f"建筑点: {np.sum(building_mask)}") +print(f"建筑最高点: {points[building_mask, 2].max():.1f}m") +print(f"场景范围: {points.max(axis=0) - points.min(axis=0)}") + +# ===== Step 6: 表面重建 (可选) ===== +# 使用Poisson重建将点云转为网格 +mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson( + pcd_clean, depth=8 +) + +# 保存网格模型 +o3d.io.write_triangle_mesh("city_model.obj", mesh) +print("城市模型已保存为 city_model.obj") +\end{lstlisting} + +\subsection{各领域3D技术选型参考} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}llll@{}} +\toprule\noalign{} +设计领域 & 首选3D表示 & 推荐技术 & 典型工具 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +建筑 & 网格 + BIM & 3DGS/NeRF重建 & Pix4D, RealityCapture \\ +景观 & 点云 + DEM & LiDAR + 语义分割 & CloudCompare, LAStools \\ +城市设计 & 网格 + 体素 & 倾斜摄影测量 & Cesium, CityEngine \\ +室内设计 & 网格 & RGB-D扫描 & Matterport, Polycam \\ +工业设计 & 网格 & 结构光扫描 & Artec, Shining 3D \\ +\end{longtable} +} + +\subsection{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 如果你需要为一个历史街区制定保护规划,会采用哪种3D数据采集和重建方案?说明理由。 +\item + 比较NeRF和3DGS在建筑外观重建中的优缺点,什么场景下选哪种? +\item + 设计一个利用3D扫描和AI技术辅助室内改造的完整方案,包括数据流、技术选型和用户交互。 +\end{enumerate} + + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \textbf{表示方式选择}:针对以下三种场景,分别选择最合适的3D表示方式(点云、网格、体素或深度图),并说明理由:(a) 自动驾驶中的实时障碍物检测;(b) 游戏中的角色建模;(c) 室内装修方案的VR预览。 +\item + \textbf{技术路线对比}:NeRF和3D Gaussian Splatting分别代表了隐式和显式的场景表示路线。请从设计应用的角度分析:哪些设计场景更适合NeRF,哪些更适合3DGS?未来两者会融合还是分化? +\item + \textbf{空间智能畅想}:设想你正在设计一个''AI空间设计师助手'',它能理解建筑平面图、3D模型和自然语言描述。请描述这个系统的核心功能模块,以及每个模块需要用到本章学到的哪些技术。 +\end{enumerate} + +\section{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +中文 & 英文 & 说明 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +点云 & Point Cloud & 三维坐标点的集合 \\ +网格 & Mesh & 顶点、边、面组成的多面体 \\ +体素 & Voxel & 三维空间规则网格单元 \\ +深度图 & Depth Map & 存储距离信息的二维图像 \\ +激光雷达 & LiDAR & 激光测距三维传感器 \\ +置换不变性 & Permutation Invariance & 输入顺序不影响输出 \\ +运动恢复结构 & Structure from Motion (SfM) & 从多视角照片恢复3D结构 \\ +多视图立体匹配 & Multi-View Stereo (MVS) & 稠密3D重建方法 \\ +神经辐射场 & NeRF & 用MLP隐式表示三维场景 \\ +体渲染 & Volume Rendering & 沿光线积分合成图像 \\ +三维高斯溅射 & 3D Gaussian Splatting & 用高斯椭球体显式表示场景 \\ +位置编码 & Positional Encoding & 提升高频细节的编码方法 \\ +空间智能 & Spatial Intelligence & 理解和推理空间关系的能力 \\ +场景图 & Scene Graph & 描述物体间关系的图结构 \\ +数字孪生 & Digital Twin & 物理空间的完整数字副本 \\ +地理信息系统 & GIS & 地理空间数据管理系统 \\ +\end{longtable} +} diff --git a/chapters/ch06-generative.tex b/chapters/ch06-generative.tex new file mode 100644 index 0000000..fc214a7 --- /dev/null +++ b/chapters/ch06-generative.tex @@ -0,0 +1,641 @@ +\chapter{生成式AI——从创造到智能生成} + +\section{篇章导读} + +生成式AI(Generative AI)正在重新定义创造的边界。从图像生成到音乐创作,从文本写作到代码生成,AI不再仅仅是分析和识别的工具,而是成为人类的''创意伙伴''(Creative Partner)。设计师可以用文字描述一个想法,AI便能将其转化为可视化的图像;建筑师可以勾勒一个草图,AI便能渲染出逼真的效果图。这种从''分析''到''创造''的转变,正是生成式AI最激动人心的地方。 + +本章将从生成模型的基本原理出发,系统介绍从自编码器(AE)、对抗生成网络(GAN)到扩散模型(Diffusion Model)的技术演进,并深入探讨AIGC工具链在设计领域的实际应用。 + + +\section{早期生成模型} + +\subsection{自编码器(Autoencoder, AE)} + +自编码器是最早的生成模型思想之一,其核心理念是\textbf{学习数据的压缩表示}。 + +\textbf{基本结构:} + +\begin{lstlisting} +输入 → 编码器 (Encoder) → 潜在表示 (Latent) → 解码器 (Decoder) → 重构输出 +\end{lstlisting} + +自编码器的工作方式可以理解为''先压缩,再还原'':编码器将输入数据压缩到一个低维的潜在空间(Latent Space),解码器再从潜在表示中还原出原始数据。通过训练使还原输出尽可能接近原始输入,模型便学会了数据的关键特征。 + +\textbf{局限性:} + +\begin{itemize} +\tightlist +\item + 生成的图像通常\textbf{模糊},缺乏细节 +\item + 潜在空间缺乏结构,无法保证连续采样产生有意义的输出 +\item + 生成\textbf{多样性不足},更偏向重构而非创造 +\end{itemize} + +\begin{quote} +\textbf{设计类比}:AE就像一位只会临摹的画师——他能把看到的景象画出来,但画得不够精细,也无法凭空创造出新的画面。 +\end{quote} + +\subsection{变分自编码器(Variational Autoencoder, VAE)} + +VAE在AE的基础上引入了\textbf{概率思想},是生成模型的重要进步。 + +\textbf{核心改进:} + +\begin{lstlisting} +传统AE: 编码器 → 确定的潜在向量 z → 解码器 +VAE: 编码器 → 均值 μ、方差 σ → 采样 z ~ N(μ, σ²) → 解码器 +\end{lstlisting} + +VAE的关键在于将潜在空间约束为\textbf{标准正态分布}。这意味着潜在空间中的每个点都对应一个合理的输出,我们可以通过从正态分布中随机采样,再经过解码器,来\textbf{生成全新的图像}。 + +\begin{lstlisting} +从标准正态分布中随机采样 z + ↓ +解码器 (Decoder) + ↓ +生成全新图像 +\end{lstlisting} + +\textbf{优势与不足:} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +特性 & AE & VAE \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +潜在空间 & 无约束 & 标准正态分布 \\ +可采样性 & 不可 & 可采样生成新图像 \\ +生成质量 & 模糊 & 略好但仍偏模糊 \\ +多样性 & 低 & 较高 \\ +\end{longtable} +} + +\begin{quote} +\textbf{设计类比}:VAE就像一位理解了''风格空间''的画师——他不仅会临摹,还能在''风格空间''中探索,画出从未见过但风格一致的新作品。 +\end{quote} + + +\section{对抗生成} + +\subsection{生成对抗网络(GAN)} + +2014年,Ian Goodfellow提出了生成对抗网络(Generative Adversarial Network, GAN),开创了生成模型的新范式。 + +\textbf{核心思想:对抗博弈} + +\begin{lstlisting} +生成器 (Generator):生成假图像 → 试图欺骗判别器 +判别器 (Discriminator):判断图像真假 → 试图识破生成器 + ↓ +对抗训练,相互博弈,共同进步 +\end{lstlisting} + +GAN的训练过程可以类比为\textbf{伪造者与鉴定师}的博弈: + +\begin{itemize} +\tightlist +\item + \textbf{伪造者}(生成器)不断改进伪造技术,制造更逼真的假画 +\item + \textbf{鉴定师}(判别器)不断提升辨别能力,区分真画和假画 +\item + 随着对抗的持续,伪造者的技术越来越高超,最终能制造出连鉴定师都无法分辨的''杰作'' +\end{itemize} + +\textbf{训练过程:} + +\begin{lstlisting} +步骤1:生成器从随机噪声生成假图像 +步骤2:判别器同时接收真实图像和假图像 +步骤3:判别器输出"真"或"假"的判断 +步骤4:根据判别结果,同时更新生成器和判别器 +步骤5:重复以上过程,直到生成器能产生逼真图像 +\end{lstlisting} + +\textbf{优势:} + +\begin{itemize} +\tightlist +\item + 生成图像质量高,细节丰富 +\item + 训练速度较快(相比扩散模型) +\end{itemize} + +\textbf{问题:} + +\begin{itemize} +\tightlist +\item + \textbf{训练不稳定}:生成器和判别器需要精心平衡,容易出现一方过强 +\item + \textbf{模式崩溃(Mode Collapse)}:生成器可能只学会生成少数几种图像,缺乏多样性 +\item + 超参数敏感,调参困难 +\end{itemize} + +\subsection{StyleGAN:高质量人脸生成} + +StyleGAN是NVIDIA推出的系列模型,在人脸生成领域取得了突破性成果。 + +\textbf{核心创新——风格控制:} + +\begin{lstlisting} +随机噪声 z → 映射网络 → 风格向量 w + ↓ +风格向量 w 注入生成器的不同层: + - 浅层:控制粗粒度特征(脸型、姿态) + - 中层:控制中粒度特征(发型、表情) + - 深层:控制细粒度特征(肤色、细节) + ↓ +生成高质量人脸图像 +\end{lstlisting} + +StyleGAN可以精确控制生成人脸的各个属性——年龄、性别、发型、表情等,并且生成的人脸在视觉上与真人照片几乎无法区分。 + +\subsection{CycleGAN:无配对图像转换} + +CycleGAN解决了一个重要的实际问题:\textbf{无需成对训练数据}的图像风格转换。 + +\begin{lstlisting} +领域A(如:照片)←→ 领域B(如:油画) + ↓ +生成器G:A → B(照片变油画) +生成器F:B → A(油画变照片) + ↓ +循环一致性约束:F(G(A)) ≈ A +\end{lstlisting} + +CycleGAN的设计应用十分广泛:实景照片转水彩风格、白天场景转夜晚、夏季景观转冬季等。 + +\begin{quote} +\textbf{设计思考}:GAN系列模型展示了''对抗''这一全新的训练范式——不是告诉模型''正确答案是什么'',而是让两个模型在竞争中共同进化。这种思想在设计领域同样适用:方案生成与方案评审的对抗,可以推动设计质量的提升。 +\end{quote} + + +\section{扩散模型} + +\subsection{核心原理} + +扩散模型(Diffusion Model)是当前生成式AI的主流技术,其核心思想出人意料地简洁:\textbf{先学会如何破坏,再学会如何修复}。 + +\textbf{前向过程(Forward Process)——逐步加噪:} + +\begin{lstlisting} +原始图像 x₀ + ↓ 添加高斯噪声 +x₁ = √(1-β₁)·x₀ + √β₁·ε₁ + ↓ 添加噪声 +x₂ = √(1-β₂)·x₁ + √β₂·ε₂ + ↓ ...(重复T步) +x_T ≈ 纯噪声(与原始图像完全无关) +\end{lstlisting} + +前向过程就像往一幅画上逐步泼洒墨水,每一步都让画面变得更模糊,最终变成完全的噪声。 + +\textbf{反向过程(Reverse Process)——逐步去噪:} + +\begin{lstlisting} +纯噪声 x_T + ↓ 去噪网络预测并移除噪声 +x_{T-1} = 去噪一步 + ↓ 去噪网络预测并移除噪声 +x_{T-2} = 去噪一步 + ↓ ...(重复T步) +x₀ ≈ 原始图像 +\end{lstlisting} + +反向过程则像一位技艺精湛的修复师,从一团混沌的噪声中,逐步还原出清晰的图像。 + +\textbf{训练目标:} + +\begin{lstlisting} +去噪网络学习预测:添加的噪声 ε + 即:给定 noisy image x_t 和时间步 t,预测 ε + 损失函数:L = ||ε - ε_θ(x_t, t)||² +\end{lstlisting} + +模型不需要学习''好图像长什么样'',而是学习''噪声长什么样''——这是一个更容易学习的目标。 + +\subsection{Stable Diffusion架构} + +Stable Diffusion是扩散模型最重要的工程实现,其核心创新是\textbf{在潜在空间(Latent Space)中进行扩散},而非直接在像素空间操作,从而大幅提升了效率。 + +\textbf{整体架构:} + +\begin{lstlisting} +文本提示 "一只猫,水彩画风格" + ↓ +Text Encoder (CLIP文本编码器) → 文本特征向量 + ↓ +随机噪声(在潜在空间中) + ↓ +U-Net 去噪网络(条件引导:文本特征) + ↓ 反复去噪T步 +去噪后的潜在表示 + ↓ +VAE Decoder (解码器) + ↓ +生成图像 +\end{lstlisting} + +\textbf{核心组件:} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +组件 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +作用 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +VAE Encoder/Decoder & 图像与潜在空间的转换 & 将高维图像压缩到低维潜在空间,提升效率 \\ +U-Net & 去噪网络 & 核心生成引擎,预测并移除噪声 \\ +Text Encoder (CLIP) & 文本编码 & 将文本提示转化为模型可理解的特征向量 \\ +CLIP & 文图对齐 & 确保生成的图像与文本描述语义一致 \\ +\end{longtable} +} + +\textbf{潜在空间扩散的优势:} + +\begin{itemize} +\tightlist +\item + 在低维空间操作,\textbf{计算量大幅降低} +\item + 压缩过程自动去除冗余信息,保留语义关键特征 +\item + 使消费级显卡也能运行生成模型 +\end{itemize} + +\subsection{文生图工作流(Text-to-Image Workflow)} + +从文字到图像的完整流程: + +\begin{lstlisting} +1. 输入提示词(Prompt) + "一座现代风格的别墅,白色外墙,大面积落地窗,周围绿树环绕,日落光线" + +2. 文本编码 + Prompt → CLIP Text Encoder → 文本特征向量 + +3. 初始化噪声 + 在潜在空间中生成随机噪声 + +4. 去噪循环 + for t = T → 1: + 噪声图 → U-Net(条件:文本特征 + 时间步)→ 预测噪声 → 减去噪声 + +5. 解码输出 + 潜在表示 → VAE Decoder → 最终图像 +\end{lstlisting} + +\textbf{提示词工程(Prompt Engineering)} 是影响生成质量的关键因素。一个好的提示词通常包含: + +\begin{itemize} +\tightlist +\item + \textbf{主体描述}:画面核心内容 +\item + \textbf{风格指定}:如''水彩画''\,``赛博朋克''``极简主义'' +\item + \textbf{质量修饰}:如''高清''\,``细节丰富''``4K'' +\item + \textbf{光照氛围}:如''黄金时段光线''\,``柔和阴影'' +\end{itemize} + +\begin{quote} +\textbf{设计类比}:文生图过程就像一位设计师根据客户的文字需求进行创作。提示词是''设计任务书'',CLIP编码器理解需求,U-Net是''设计师的大脑'',而VAE解码器将脑海中的概念转化为可见的图纸。 +\end{quote} + + +\section{AIGC工具链} + +\subsection{ControlNet:精确条件控制} + +纯文生图虽然强大,但设计师往往需要\textbf{精确控制}空间结构——这正是ControlNet解决的问题。 + +\textbf{核心原理:} + +\begin{lstlisting} +输入图像 → 提取结构条件(边缘/深度/姿态/分割) + ↓ +条件特征注入ControlNet + ↓ +ControlNet与主U-Net协同 + ↓ +输出:保持结构条件 + 应用风格 +\end{lstlisting} + +\textbf{支持的典型条件类型:} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}llll@{}} +\toprule\noalign{} +条件类型 & 英文名 & 说明 & 设计应用 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Canny边缘 & Canny Edge & 检测图像轮廓 & 草图控制、线稿渲染 \\ +深度图 & Depth Map & 估计场景深度 & 空间关系控制 \\ +人体姿态 & OpenPose & 检测人体关键点 & 人物场景生成 \\ +法线图 & Normal Map & 表面法线方向 & 材质细节控制 \\ +语义分割 & Segmentation & 区域语义标注 & 功能区域控制 \\ +\end{longtable} +} + +\textbf{设计工作流示例:} + +\begin{lstlisting} +手绘草图 → Canny边缘提取 → ControlNet条件控制 → 精细效果图 +户型平面图 → 深度图提取 → ControlNet条件控制 → 三维透视渲染 +结构线稿 → 分割图提取 → ControlNet条件控制 → 风格化设计方案 +\end{lstlisting} + +\subsection{LoRA:高效微调} + +全量微调一个大模型需要巨大的计算资源,而LoRA(Low-Rank Adaptation,低秩适应)提供了一种\textbf{高效微调}方案。 + +\textbf{核心原理:} + +\begin{lstlisting} +原始权重矩阵 W(冻结不变,参数量 d×d) + + +低秩分解矩阵 ΔW = A × B(仅训练这部分) + A: d×r, B: r×d(r << d) + ↓ +新权重 = W + ΔW = W + A×B + ↓ +参数量从 d² 降低到 2×d×r(减少100-1000倍) +\end{lstlisting} + +\textbf{LoRA的核心优势:} + +\begin{itemize} +\tightlist +\item + 参数量减少\textbf{100-1000倍},大幅降低训练成本 +\item + 训练速度快,个人电脑即可完成 +\item + 多个LoRA可灵活叠加组合 +\end{itemize} + +\textbf{应用方式:} + +\begin{lstlisting} +基础模型 + LoRA_A(建筑风格)= 建筑风格生成 +基础模型 + LoRA_B(室内风格)= 室内风格生成 +基础模型 + LoRA_A + LoRA_B = 混合风格生成 +\end{lstlisting} + +设计师可以针对特定设计风格训练专属LoRA,如''新中式风格''\,``日式极简风格''等,实现个性化的AI生成。 + +\subsection{ComfyUI:模块化工作流} + +ComfyUI是一个基于\textbf{节点化(Node-based)} 的AIGC工作流平台,允许用户通过可视化连接来构建复杂的生成流程。 + +\textbf{核心特点:} + +\begin{lstlisting} +节点化连接 → 可视化流程 → 灵活定制 → 可复用分享 +\end{lstlisting} + +\textbf{典型节点:} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}ll@{}} +\toprule\noalign{} +节点类型 & 功能 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Load Checkpoint & 加载基础模型 \\ +CLIP Text Encode & 文本编码(正向/负向提示词) \\ +KSampler & 采样去噪(控制步数、采样器类型等) \\ +VAE Decode & 潜在空间解码为图像 \\ +ControlNet Apply & 应用ControlNet条件控制 \\ +LoRA Loader & 加载LoRA微调模型 \\ +Save Image & 保存生成图像 \\ +\end{longtable} +} + +\textbf{典型工作流示例:} + +\begin{lstlisting} +文本提示词 → CLIP编码 → 正向提示 + ↓ +负向提示词 → CLIP编码 → 负向提示 ──→ KSampler ← ControlNet条件 + ↓ + VAE解码 + ↓ + 保存图像 +\end{lstlisting} + +\subsection{Midjourney:创意探索平台} + +Midjourney是一个面向创意的AI图像生成平台,以极高的审美质量和艺术表现力著称。 + +\textbf{特点:} + +\begin{itemize} +\tightlist +\item + 操作简单,通过自然语言交互即可生成 +\item + 生成图像具有很高的艺术审美品质 +\item + 适合设计前期的\textbf{创意发散和灵感探索} +\item + 付费云服务,依赖网络连接 +\end{itemize} + +\subsection{AIGC工具对比} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2000}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2000}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2000}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2000}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2000}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +工具 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +核心优势 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +适用场景 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +使用门槛 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +部署方式 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Midjourney & 审美品质高、操作简单 & 创意探索、灵感发散 & 低 & 云端服务 \\ +Stable Diffusion & 开源可控、本地运行 & 精细控制、批量生成 & 中 & 本地部署 \\ +ControlNet & 精确结构控制 & 草图渲染、条件生成 & 中高 & 模块插件 \\ +ComfyUI & 灵活工作流、可视化 & 复杂流程、定制需求 & 高 & 本地部署 \\ +\end{longtable} +} + +\begin{quote} +\textbf{设计实践建议}:在设计流程的不同阶段,可以灵活选择不同工具。前期概念阶段用Midjourney快速探索创意方向,确定方向后用Stable Diffusion + ControlNet进行精确控制,用LoRA实现风格一致性,用ComfyUI构建自动化工作流。 +\end{quote} + + +\section{设计应用} + +\subsection{建筑设计:从草图到渲染} + +\begin{lstlisting} +手绘概念草图 + ↓ ControlNet (Canny边缘) + + 提示词:"现代风格建筑,玻璃幕墙,自然光线" + ↓ +AI生成效果图 + ↓ LoRA风格微调 +多方案对比(3-5个方案) + ↓ +设计师选择与调整 +\end{lstlisting} + +\textbf{应用价值:} + +\begin{itemize} +\tightlist +\item + 快速将手绘概念转化为可视化效果图 +\item + 生成多个设计方案进行比选 +\item + 客户沟通效率大幅提升 +\end{itemize} + +\subsection{室内设计:从平面到立体} + +\begin{lstlisting} +户型平面图 + ↓ ControlNet (Depth/Segmentation) + + 提示词:"北欧风格客厅,浅色木地板,简约家具" + ↓ +三维空间效果图 + ↓ LoRA材质替换 +不同材质方案(木质/石材/金属) + ↓ +风格迁移 → 多风格方案 +\end{lstlisting} + +\subsection{平面设计:品牌视觉生成} + +\begin{lstlisting} +品牌关键词:"科技感、绿色环保、信任感" + ↓ +AI生成Logo候选方案(多组) + ↓ +设计师筛选与调整 + ↓ +品牌视觉系统延展(名片、海报、包装) +\end{lstlisting} + +\subsection{综合案例:住宅客厅设计工作流} + +以下是一个完整的AI辅助住宅客厅设计工作流: + +\begin{lstlisting} +第1步:需求输入 + 客户需求:"20㎡客厅,现代简约,预算3万元,朝南,适合家庭活动" + ↓ +第2步:AI生成多方案 + 方案A:开放式布局,浅色调,北欧简约 + 方案B:L型沙发布局,中性色调,日式风格 + 方案C:分区布局,暖色调,现代轻奢 + ↓ +第3步:用户选择与调整 + 客户选择方案B → "希望增加书房功能" + ↓ +第4步:AI迭代优化 + 基于反馈调整 → 融合阅读角功能 + ↓ +第5步:VR预览 + AI生成全景图 → VR沉浸式体验 + ↓ +第6步:最终确认 + 设计师微调 → 客户确认 → 施工图 +\end{lstlisting} + +\begin{quote} +\textbf{设计反思}:生成式AI极大地提升了设计效率,但它始终是\textbf{辅助工具}而非替代者。设计师的审美判断、空间理解、人文关怀——这些是AI无法取代的核心能力。AI的价值在于扩展设计师的创造力边界,而非取代设计师本身。 +\end{quote} + + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \textbf{原理理解}:Diffusion模型为什么比GAN训练更稳定?从训练目标的角度进行分析。 +\item + \textbf{技术对比}:对比AE、VAE、GAN和Diffusion四种生成模型,分析各自的优势和局限。在什么场景下你会选择哪种模型? +\item + \textbf{工具应用}:如果你需要将一张手绘建筑草图转化为写实渲染图,请设计一个完整的AIGC工作流(包括使用的工具、条件和提示词策略)。 +\item + \textbf{设计实践}:选择一个室内空间,分别使用Midjourney和Stable Diffusion + ControlNet生成设计方案,对比两者的生成效果和可控性。 +\item + \textbf{伦理思考}:AI生成的设计作品,版权归属于谁?训练数据中使用了大量设计师的作品,这是否构成侵权?你如何看待这个问题? +\end{enumerate} + + +\section{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +自编码器 & Autoencoder (AE) & 学习数据压缩与重构的模型 \\ +变分自编码器 & Variational Autoencoder (VAE) & 引入概率分布的自编码器,可采样生成 \\ +生成对抗网络 & Generative Adversarial Network (GAN) & 生成器与判别器对抗训练的生成模型 \\ +扩散模型 & Diffusion Model & 通过加噪-去噪过程生成数据的模型 \\ +去噪 & Denoising & 移除噪声、还原图像的过程 \\ +潜在空间 & Latent Space & 压缩后的低维数据表示空间 \\ +提示词 & Prompt & 指导AI生成的文本描述 \\ +条件控制 & Conditional Control (ControlNet) & 通过结构条件精确引导生成过程 \\ +低秩适应 & LoRA (Low-Rank Adaptation) & 低秩矩阵分解的高效微调方法 \\ +模式崩溃 & Mode Collapse & GAN生成多样性不足的现象 \\ +采样器 & Sampler & 去噪采样算法,决定生成过程的具体方式 \\ +文图对齐 & CLIP & 实现文本与图像语义对应的技术 \\ +提示词工程 & Prompt Engineering & 设计优化提示词以提升生成质量的技术 \\ +\end{longtable} +} diff --git a/chapters/ch07-agent.tex b/chapters/ch07-agent.tex new file mode 100644 index 0000000..7bb2a03 --- /dev/null +++ b/chapters/ch07-agent.tex @@ -0,0 +1,674 @@ +\chapter{AI Agent——从执行到自主} + +\section{篇章导读} + +AI Agent(智能体)代表了人工智能的下一个前沿:从''被动响应''到''主动行动'',从''单一能力''到''系统协同''。如果说前几章介绍的AI模型是''工具'',那么AI Agent就是能\textbf{自主使用工具的助手}。 + +想象这样一幅场景:你告诉AI''帮我分析这块场地的开发潜力'',它不再只是被动地等待你一步步指令,而是主动调用地图工具获取地块信息、查询规划数据库核对用地性质、分析日照和交通数据、最终生成一份完整的场地分析报告。这就是AI Agent——一个能感知环境、制定计划、调用工具并持续改进的智能系统。 + +本章将从规则系统出发,系统介绍LLM-based Agent的架构、推理模式、多Agent协作机制,以及在设计领域的应用前景。 + + +\section{从规则到智能} + +\subsection{规则系统时代} + +最早的''智能系统''基于\textbf{规则(Rules)},即''如果满足条件A,则执行动作B''。 + +\textbf{典型结构:} + +\begin{lstlisting} +if 场地坡度 > 25%: + 标记为"不适宜建设" +elif 场地坡度 > 15%: + 标记为"限制建设区" +else: + 标记为"适宜建设" +\end{lstlisting} + +\textbf{专家系统(Expert System)} 是这一范式的代表:将领域专家的知识编码为大量if-then规则,构建知识库,通过推理引擎进行逻辑推断。 + +\textbf{局限性:} + +\begin{itemize} +\tightlist +\item + 规则难以穷举——现实世界的问题远比预想的复杂 +\item + 无法泛化——遇到规则未覆盖的新情况便束手无策 +\item + 维护困难——规则数量膨胀后,系统变得难以理解和更新 +\item + 缺乏理解——系统并不''理解''规则背后的含义,只是机械执行 +\end{itemize} + +\subsection{传统规划方法} + +在规则系统之外,符号AI(Symbolic AI)还发展出了\textbf{规划(Planning)} 方法: + +\begin{lstlisting} +定义初始状态 → 定义目标状态 → 定义操作算子 → 搜索路径 → 执行计划 +\end{lstlisting} + +这类方法在限定领域内效果良好(如国际象棋、路径规划),但面对开放、模糊的现实设计任务时,往往难以定义完整的状态空间和操作算子。 + +\subsection{LLM带来的范式转变} + +大语言模型(LLM, Large Language Model)的出现,为Agent的发展带来了根本性的转变: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +特性 & 规则系统 & LLM-based Agent \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +知识表示 & 人工编写规则 & 从海量数据中学习 \\ +理解能力 & 无真正理解 & 深度语义理解 \\ +泛化能力 & 仅限规则覆盖范围 & 可处理未见过的任务 \\ +交互方式 & 结构化输入 & 自然语言对话 \\ +推理能力 & 逻辑推理 & 逻辑+常识+类比推理 \\ +\end{longtable} +} + +LLM之所以能成为Agent的''大脑'',关键在于它具备了: + +\begin{itemize} +\tightlist +\item + \textbf{语义理解}:理解用户的真实意图,而非仅仅匹配关键词 +\item + \textbf{常识推理}:运用大量世界知识进行合理推断 +\item + \textbf{指令遵循}:按照复杂的指令序列执行任务 +\item + \textbf{工具学习}:通过描述快速学会使用新工具 +\end{itemize} + + +\section{LLM-based Agent}\label{llm-based-agent} + +\subsection{核心组件} + +一个完整的LLM-based Agent由以下核心模块构成: + +\begin{lstlisting} +┌─────────────────────────────────────────────────┐ +│ LLM Core │ +│ (大语言模型:推理、决策中枢) │ +├─────────────────────────────────────────────────┤ +│ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ 感知 │ │ 记忆 │ │ 工具 │ │ +│ │Perception│ │ Memory │ │ Tool Use │ │ +│ └──────────┘ └──────────┘ └──────────┘ │ +│ │ +│ ┌──────────┐ ┌──────────┐ │ +│ │ 规划 │ │ 反思 │ │ +│ │ Planning │ │Reflection│ │ +│ └──────────┘ └──────────┘ │ +│ │ +└─────────────────────────────────────────────────┘ +\end{lstlisting} + +\subsection{感知(Perception)} + +感知模块负责\textbf{接收和理解外部信息}: + +\begin{lstlisting} +输入信息 → 解析与理解 + - 用户指令:"帮我设计一个小型社区公园" + - 环境状态:场地数据、周边条件、限制因素 + - 工具反馈:查询结果、执行状态、错误信息 +\end{lstlisting} + +感知的关键在于\textbf{理解意图}——用户说''设计一个公园'',Agent需要理解这涉及场地分析、功能分区、路径规划、植物配置等多个子任务。 + +\subsection{规划(Planning)} + +规划模块负责\textbf{将复杂目标分解为可执行的步骤}: + +\begin{lstlisting} +目标:"设计一个社区公园" + ↓ 分解 +子任务1:分析场地条件(地形、面积、周边环境) +子任务2:确定功能分区(儿童游乐、健身、休憩、绿化) +子任务3:布局路径系统(主入口、环线、无障碍通道) +子任务4:选择植物配置(适地适树、四季景观) +子任务5:评估与优化(成本、可达性、景观效果) + ↓ +确定执行顺序和依赖关系 +\end{lstlisting} + +\subsection{记忆(Memory)} + +记忆模块为Agent提供\textbf{信息存储和检索}能力: + +\begin{lstlisting} +┌─────────────────────────────────────────┐ +│ 短期记忆 (Short-term Memory) │ +│ 对话上下文、当前任务状态、临时变量 │ +│ 特点:容量有限,任务结束后清除 │ +├─────────────────────────────────────────┤ +│ 长期记忆 (Long-term Memory) │ +│ 知识库、经验积累、历史案例 │ +│ 特点:持久存储,可跨任务复用 │ +└─────────────────────────────────────────┘ +\end{lstlisting} + +\textbf{记忆的常见实现方式:} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +类型 & 实现方式 & 说明 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +短期记忆 & 上下文窗口(Context Window) & 当前对话的历史记录 \\ +工作记忆 & 划痕板(Scratchpad) & 中间计算结果和推理过程 \\ +长期记忆 & 向量数据库(Vector Database) & 嵌入式检索相关知识 \\ +程序性记忆 & 工具库(Tool Library) & 已学会的工具使用方法 \\ +\end{longtable} +} + +\subsection{工具调用(Tool Use)} + +工具调用是Agent与外部世界交互的关键能力: + +\begin{lstlisting} +可用工具集: + - 数据库查询:查询规划规范、用地数据 + - GIS工具:获取地形、高程、坡度信息 + - API调用:获取天气数据、交通数据 + - 代码执行:运行计算脚本、数据处理 + - 图像生成:调用Stable Diffusion等生成模型 + - 文件操作:读取CAD图纸、导出PDF报告 +\end{lstlisting} + +Agent的核心能力在于根据任务需要\textbf{自主选择和组合工具},而非按预设流程机械调用。 + + +\section{推理模式} + +\subsection{思维链(Chain of Thought, CoT)} + +CoT是最基础的推理增强技术,核心思想是\textbf{将推理过程显式化}。 + +\textbf{基本模式:} + +\begin{lstlisting} +问题 → 推理链(一步步思考) → 答案 +\end{lstlisting} + +\textbf{设计示例——``设计一个公园'':} + +\begin{lstlisting} +问题:"在3000㎡的社区用地上设计一个公园" + +推理链: +Step 1:分析场地条件 + → 场地面积3000㎡,属于中小型社区公园 + → 需要满足不同年龄段的休闲需求 + +Step 2:确定功能分区 + → 儿童活动区(约600㎡):滑梯、沙坑、秋千 + → 健身运动区(约500㎡):器材、慢跑道 + → 休闲游憩区(约800㎡):座椅、凉亭、景观小品 + → 绿化种植区(约1100㎡):草坪、花境、乔木 + +Step 3:布局路径系统 + → 主入口连接城市道路 + → 环形主路串联各功能区 + → 次级步道提供更丰富的游线体验 + +Step 4:选择植物配置 + → 选用本地适生树种 + → 考虑四季景观变化 + → 兼顾遮阴和观赏需求 + +答案:完整的公园设计方案 +\end{lstlisting} + +CoT的价值在于\textbf{让思考过程可见},这不仅提升了推理的准确性,也使结果更具可解释性。 + +\subsection{ReAct(Reasoning + Acting)}\label{reactreasoning-acting} + +ReAct模式将\textbf{推理与行动交替进行},形成''思考-行动-观察''的循环。 + +\textbf{基本循环:} + +\begin{lstlisting} +Think(思考):分析当前状态,决定下一步行动 + ↓ +Act(行动):调用工具或执行操作 + ↓ +Observe(观察):获取行动结果和反馈 + ↓ +Think(思考):基于观察结果,决定下一步行动 + ↓ +...(循环直到任务完成) +\end{lstlisting} + +\textbf{设计示例——场地分析任务:} + +\begin{lstlisting} +Think:用户要求分析这块场地的开发潜力,我需要先获取基本信息。 +Act:调用GIS工具,获取场地位置和高程数据。 +Observe:场地位于北纬31.2°,东经121.5°,平均高程12m,最大高差3m。 + +Think:地形比较平坦,适合建设。接下来需要查询规划限制。 +Act:调用规划数据库,查询该地块的用地性质和容积率限制。 +Observe:用地性质为R2(二类居住用地),容积率≤2.5,建筑限高60m。 + +Think:用地性质和开发强度明确。现在分析日照和交通条件。 +Act:调用日照分析工具和交通数据API。 +Observe:南侧无遮挡,日照充足。距地铁站800m,公交站200m。 + +Think:所有关键数据已获取,可以生成分析报告了。 +Act:整合信息,生成场地开发潜力评估报告。 +Observe:报告已生成,包含地形、规划、日照、交通四维分析。 + +Think:任务完成,向用户展示报告。 +\end{lstlisting} + +ReAct模式的优势在于\textbf{可以根据中间结果动态调整策略},而非严格按照预设流程执行。 + +\subsection{反思(Reflection)} + +反思机制使Agent能够\textbf{自我评估和改进}: + +\begin{lstlisting} +执行任务 → 评估结果 → 发现不足 → 调整策略 → 重新执行 +\end{lstlisting} + +\textbf{示例:} + +\begin{lstlisting} +第1轮:Agent生成设计方案A +反思:方案A的路径系统不够流畅,存在多个死角 +调整:优化路径拓扑结构,增加环路设计 + +第2轮:Agent生成改进方案B +反思:方案B的绿化率偏低,不满足规范要求 +调整:增加绿化面积,调整硬质铺装比例 + +第3轮:Agent生成最终方案C +评估:满足所有约束条件,方案质量达标 +输出:最终方案 +\end{lstlisting} + + +\section{多Agent协作} + +\subsection{单Agent架构} + +单Agent适合\textbf{相对简单的任务}: + +\begin{lstlisting} +用户请求 → 单一Agent(LLM + 工具) → 执行结果 +\end{lstlisting} + +当任务复杂度增加时,单个Agent面临挑战: + +\begin{itemize} +\tightlist +\item + 上下文窗口有限,难以处理大量信息 +\item + 同时扮演多个角色,专业性不足 +\item + 错误容易累积,缺乏交叉验证 +\end{itemize} + +\subsection{多Agent协作} + +多Agent系统通过\textbf{分工协作}解决复杂任务: + +\begin{lstlisting} +┌───────────┐ ┌───────────┐ ┌───────────┐ +│ 规划Agent │ → │ 分析Agent │ → │ 设计Agent │ +│ Planner │ │ Analyst │ │ Designer │ +└───────────┘ └───────────┘ └───────────┘ + ↓ ↓ ↓ + 任务分解 数据分析 方案生成 +\end{lstlisting} + +\textbf{各Agent的职责分工:} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +Agent角色 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +职责 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +使用工具 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +规划Agent (Planner) & 理解需求、分解任务、协调进度 & 任务管理、调度工具 \\ +分析Agent (Analyst) & 场地分析、数据收集、条件评估 & GIS工具、数据库查询、统计分析 \\ +设计Agent (Designer) & 方案生成、空间布局、效果渲染 & CAD工具、生成模型、设计规范库 \\ +审查Agent (Reviewer) & 合规检查、质量评估、问题标记 & 规范数据库、检查规则 \\ +\end{longtable} +} + +\subsection{Agent通信模式} + +多Agent之间的通信是协作的关键: + +\begin{lstlisting} +模式1:顺序传递(Pipeline) + Agent_A → Agent_B → Agent_C → 最终结果 + +模式2:讨论协商(Debate) + Agent_A ← 讨论 → Agent_B + ↓ 达成共识 + 最终方案 + +模式3:层级管理(Hierarchical) + 管理Agent → 分配任务给多个子Agent → 汇总结果 + +模式4:群体协作(Group Chat) + 多个Agent在同一"讨论组"中协作 + 各自贡献专业能力,共同解决问题 +\end{lstlisting} + +\subsection{新兴Agent社会} + +随着Agent技术的发展,正在出现更复杂的协作形态: + +\begin{itemize} +\tightlist +\item + \textbf{Agent团队}:多个Agent组成固定团队,各有专长 +\item + \textbf{Agent市场}:Agent可以''雇佣''其他Agent完成特定子任务 +\item + \textbf{Agent社会}:大量Agent在开放环境中自主交互和协作 +\end{itemize} + +\begin{quote} +\textbf{设计思考}:多Agent协作模式与设计团队的工作方式高度相似——项目总负责人协调各专业(规划、建筑、结构、景观),各专业设计师各司其职又相互配合。AI Agent系统的设计可以从现实设计团队的协作经验中汲取灵感。 +\end{quote} + + +\section{协作与协议} + +\subsection{MCP协议(Model Context Protocol)} + +\textbf{MCP(模型上下文协议)} 是连接AI模型与外部工具和数据的开放标准。 + +\textbf{核心问题:数据孤岛} + +\begin{lstlisting} +传统方式: + AI模型A → 只能访问数据源X + AI模型B → 只能访问数据源Y + AI模型C → 只能访问数据源Z + → 数据孤岛,工具碎片化 + +MCP方式: + AI模型 ← MCP统一接口 → 所有工具和数据源 + → 标准化连接,即插即用 +\end{lstlisting} + +\textbf{MCP架构:} + +\begin{lstlisting} +┌────────────────────────────────────────────┐ +│ AI Application │ +│ (Claude、ChatGPT、自定义应用等) │ +└──────────────────┬─────────────────────────┘ + │ MCP协议 +┌──────────────────┴─────────────────────────┐ +│ MCP Client(客户端) │ +├────────────────────────────────────────────┤ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ 文件系统 │ │ 数据库 │ │ API服务 │ │ +│ │ Server │ │ Server │ │ Server │ │ +│ └──────────┘ └──────────┘ └──────────┘ │ +│ ┌──────────┐ ┌──────────┐ │ +│ │ GIS工具 │ │ 设计软件 │ ...更多工具 │ +│ │ Server │ │ Server │ │ +│ └──────────┘ └──────────┘ │ +└────────────────────────────────────────────┘ +\end{lstlisting} + +\textbf{MCP的核心价值:} + +\begin{itemize} +\tightlist +\item + \textbf{标准化}:统一接口协议,不同工具无需逐一适配 +\item + \textbf{即插即用}:新增工具只需实现MCP接口即可接入 +\item + \textbf{安全可控}:权限管理、审计日志、访问控制 +\item + \textbf{生态开放}:社区可贡献各类MCP Server +\end{itemize} + +\subsection{HITL:人在回路(Human-in-the-Loop)} + +\textbf{HITL(Human-in-the-Loop)} 是在AI决策的关键环节引入人类干预的协作模式。 + +\textbf{HITL的层次:} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}llll@{}} +\toprule\noalign{} +层次 & 人类角色 & 自动化程度 & 适用场景 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +完全自动 & 无干预 & 100\% & 低风险、标准化任务 \\ +人工审核 & 监督者 & 80-90\% & 常规任务,抽查关键节点 \\ +交互决策 & 合作伙伴 & 50-70\% & 复杂设计,人机共创 \\ +人工主导 & 操作者 & \textless50\% & 高风险、创新性任务 \\ +\end{longtable} +} + +\textbf{设计中的HITL工作流:} + +\begin{lstlisting} +阶段1:需求输入 + 设计师 → 描述设计需求 → AI理解 + ↓ +阶段2:AI生成 + AI → 生成多个候选方案 → 呈现给设计师 + ↓ +阶段3:设计师审核 + 设计师 → 评估方案 → 提出修改意见 + ↓ +阶段4:AI调整 + AI → 基于反馈迭代优化 → 再次呈现 + ↓ +阶段5:最终确认 + 设计师 → 确认最终方案 → AI输出成果 +\end{lstlisting} + +\begin{quote} +\textbf{设计实践原则}:AI负责快速的方案生成和数据分析,设计师负责审美判断、人文考量和最终决策。HITL不是在降低效率,而是在确保质量——让机器做机器擅长的事,让设计师专注于真正需要人类智慧的部分。 +\end{quote} + + +\section{设计应用与展望} + +\subsection{场景分析Agent} + +\textbf{输入:} 场地基础数据(位置、面积、周边环境) + +\textbf{分析流程:} + +\begin{lstlisting} +Step 1:地形分析 → 调用GIS工具 → 获取坡度、高程、排水方向 +Step 2:气候分析 → 调用气象数据API → 获取日照、风向、降雨 +Step 3:交通分析 → 调用地图API → 获取可达性、公共交通覆盖 +Step 4:视觉分析 → 调用视域分析工具 → 获取景观视野、视廊 +Step 5:法规分析 → 查询规划数据库 → 获取用地限制、退让要求 + ↓ +输出:场地综合分析报告(数据、图表、建议) +\end{lstlisting} + +\subsection{设计生成Agent} + +\textbf{输入:} 设计需求 + 场地分析报告 + +\textbf{生成流程:} + +\begin{lstlisting} +Step 1:理解需求(CoT推理) + → 解析功能要求、风格偏好、预算约束 +Step 2:功能布局(调用空间规划工具) + → 基于场地条件和需求,生成功能分区方案 +Step 3:路径连接(调用图算法) + → 设计交通流线,连接各功能区域 +Step 4:效果渲染(调用生成模型) + → 将布局方案转化为可视化效果图 + ↓ +输出:初步设计方案(图纸、效果图、说明) +\end{lstlisting} + +\subsection{合规审查Agent} + +\textbf{输入:} 设计方案 + +\textbf{审查流程:} + +\begin{lstlisting} +Step 1:调用规范库 → 获取适用的规划条文和建筑规范 +Step 2:逐条核对 → 对比设计方案与规范要求 +Step 3:标记问题 → 高亮不符合项,标注具体条款 +Step 4:生成报告 → 输出合规审查意见,含修改建议 + ↓ +输出:合规审查报告 +\end{lstlisting} + +\subsection{多Agent协同设计流程} + +三个Agent协同工作的完整流程: + +\begin{lstlisting} +场景分析Agent 设计生成Agent + ↓ ↓ +场地综合分析报告 ────────→ 需求+分析→设计方案 + ↓ + 合规审查Agent + ↓ + 审查报告+修改建议 + ↓ + 设计生成Agent(迭代优化) + ↓ + 最终设计方案(设计师确认) +\end{lstlisting} + +\subsection{未来展望} + +AI在设计领域的角色将经历三个阶段的演进: + +\textbf{短期(1-2年):AI作为工具} + +\begin{lstlisting} +AI辅助能力: + - 数据分析与可视化 + - 快速方案生成(基于模板和规则) + - 合规自动化检查 + - 文档自动生成 + +设计师角色:主导者,AI是高效的辅助工具 +\end{lstlisting} + +\textbf{中期(3-5年):AI作为助手} + +\begin{lstlisting} +AI增强能力: + - 创意发散与灵感推荐 + - 多方案自动优化与比选 + - 设计文档智能撰写 + - 实时协作与迭代反馈 + +设计师角色:导演者,AI是得力的智能助手 +\end{lstlisting} + +\textbf{长期(5-10年):AI作为合作伙伴} + +\begin{lstlisting} +AI协作能力: + - 与设计师共同创造 + - 自主处理复杂设计任务 + - 专业评审与质量把控 + - 跨领域知识融合与创新 + +设计师角色:战略决策者,AI是平等的创造伙伴 +\end{lstlisting} + +\begin{quote} +\textbf{核心观点}:无论技术如何演进,设计的核心——对人需求的理解、对美的追求、对社会和环境的责任——始终需要人类设计师的参与。AI Agent的发展方向不是取代设计师,而是让设计师从重复性劳动中解放出来,专注于更有创造性和价值的工作。 +\end{quote} + + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \textbf{架构理解}:LLM-based Agent与传统规则系统相比,有哪些本质性的优势?又可能引入哪些新的风险? +\item + \textbf{推理模式}:CoT和ReAct各适用于什么场景?请分别举一个设计领域的应用案例。 +\item + \textbf{多Agent设计}:如果要设计一个''城市规划审批Agent系统'',你会设计哪些Agent角色?它们之间如何协作? +\item + \textbf{HITL实践}:在设计流程中,哪些环节应该由AI自动完成,哪些环节必须保留人工审核?请给出你的判断依据。 +\item + \textbf{MCP理解}:MCP协议如何解决设计领域AI应用的''数据孤岛''问题?以一个具体的建筑设计场景为例进行说明。 +\item + \textbf{未来展望}:你认为AI Agent在未来10年会如何改变设计行业的就业结构?设计师应该如何准备? +\end{enumerate} + + +\section{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +智能体 & Agent & 能感知环境并自主行动的AI系统 \\ +感知 & Perception & 接收和理解外部信息的能力 \\ +规划 & Planning & 将目标分解为可执行步骤的能力 \\ +记忆 & Memory & 存储和检索信息的能力(短期+长期) \\ +工具调用 & Tool Use & 调用外部工具和API的能力 \\ +思维链 & Chain of Thought (CoT) & 将推理过程显式化的技术 \\ +推理与行动 & ReAct & 交替进行思考和行动的推理模式 \\ +反思 & Reflection & 自我评估与改进的机制 \\ +多Agent协作 & Multi-Agent Collaboration & 多个Agent分工协作解决复杂任务 \\ +模型上下文协议 & MCP (Model Context Protocol) & 连接AI与外部工具/数据的开放标准 \\ +人在回路 & HITL (Human-in-the-Loop) & 在AI关键决策环节引入人类干预 \\ +数据孤岛 & Data Silo & 各系统独立存储数据、互不连通的问题 \\ +专家系统 & Expert System & 基于规则的早期AI系统 \\ +上下文窗口 & Context Window & LLM一次能处理的最大文本长度 \\ +\end{longtable} +} diff --git a/chapters/ch08-rl.tex b/chapters/ch08-rl.tex new file mode 100644 index 0000000..c625d43 --- /dev/null +++ b/chapters/ch08-rl.tex @@ -0,0 +1,1037 @@ +\chapter{强化学习——从决策到对齐} + +\section{篇章导读} + +强化学习(Reinforcement Learning, RL)是一种通过与环境交互、从反馈中学习的范式。与监督学习从标注数据中学习不同,强化学习的智能体(Agent)通过不断尝试行动、接收奖励或惩罚信号来优化自身行为策略。 + +2016年,AlphaGo击败围棋世界冠军李世石,让强化学习走入公众视野。此后,从蛋白质结构预测(AlphaFold)到大语言模型的人类对齐(RLHF),强化学习已深入AI的各个核心领域,成为现代人工智能不可或缺的基石。 + +本章将系统介绍强化学习的基础原理、核心算法、里程碑突破,以及它在大模型对齐和设计领域的应用。我们将看到,强化学习不仅是一种算法工具,更是理解''智能体如何在复杂世界中做出决策''的关键框架。 + + +\section{学习目标} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 理解强化学习的基本框架:智能体-环境交互循环 +\item + 掌握从Q-Learning到PPO的核心算法演进 +\item + 了解Alpha系列的技术突破及其意义 +\item + 理解RLHF如何将大语言模型与人类偏好对齐 +\item + 认识具身智能(Embodied AI)与强化学习的关联 +\item + 思考强化学习在设计领域的应用场景 +\end{enumerate} + + +\section{RL基础} + +\section{核心框架:智能体与环境的交互} + +强化学习的核心是一个\textbf{智能体(Agent)与环境(Environment)的交互循环}: + +\begin{lstlisting} +┌─────────────────────────────────────────┐ +│ │ +│ ┌──────────┐ 动作 (Action) ┌──────────┐ │ +│ │ │ ──────────────────> │ │ │ +│ │ 智能体 │ │ 环境 │ │ +│ │ (Agent) │ <────────────────── │(Environ.)│ │ +│ │ │ 状态 (State) │ │ │ +│ │ │ 奖励 (Reward) │ │ │ +│ └──────────┘ └──────────┘ │ +│ │ +└─────────────────────────────────────────┘ +\end{lstlisting} + +在每一个时间步 t,交互过程如下: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 智能体观察环境的\textbf{状态(State)} s\_t +\item + 智能体根据策略选择一个\textbf{动作(Action)} a\_t +\item + 环境返回\textbf{奖励(Reward)} r\_t 和新的状态 s\_\{t+1\} +\item + 智能体根据反馈更新策略,目标是最大化\textbf{累积奖励} +\end{enumerate} + +这个过程就像一个学生做练习题:做题(选择动作),对答案(接收反馈),总结经验(更新策略),最终提高成绩(最大化累积奖励)。 + +\section{马尔可夫决策过程} + +强化学习的数学基础是\textbf{马尔可夫决策过程(Markov Decision Process, MDP)}。一个MDP由五元组 (S, A, P, R, γ) 定义: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +符号 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +含义 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +S & 状态空间(State Space) & 环境所有可能的状态集合 \\ +A & 动作空间(Action Space) & 智能体可采取的所有动作集合 \\ +P & 状态转移概率(Transition Probability) & P(s' \\ +R & 奖励函数(Reward Function) & R(s,a),在状态s采取动作a获得的即时奖励 \\ +γ & 折扣因子(Discount Factor) & 0 ≤ γ ≤ 1,衡量未来奖励的重要性 \\ +\end{longtable} +} + +\textbf{马尔可夫性质(Markov Property)} 是MDP的核心假设:未来只取决于当前状态,与过去无关。这就像下棋时,当前的棋盘状态已经包含了所有必要信息,不需要知道之前的每一步走法。 + +\section{价值函数} + +智能体的目标是最大化累积折扣奖励: + +\[G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + ... = \sum_{k=0}^{\infty} \gamma^k r_{t+k}\] + +为了评估''处于某个状态有多好'',我们定义两种价值函数: + +\textbf{状态价值函数(State Value Function)V(s)}:在状态s下,遵循策略π所能获得的期望累积奖励。 + +\[V^\pi(s) = \mathbb{E}_\pi [G_t | S_t = s]\] + +\textbf{动作价值函数(Action Value Function)Q(s,a)}:在状态s下采取动作a,之后遵循策略π所能获得的期望累积奖励。 + +\[Q^\pi(s, a) = \mathbb{E}_\pi [G_t | S_t = s, A_t = a]\] + +两者的关系是:V(s) 是对所有可能动作的Q值的加权平均。Q函数更为实用,因为它直接告诉我们在某个状态下''哪个动作最好''。 + +\section{Q-Learning}\label{q-learning} + +\textbf{Q-Learning} 是一种经典的免策略(Off-policy)时序差分算法,它直接学习最优Q函数,而不需要知道环境的具体模型。 + +其更新规则为: + +\[Q(s, a) \leftarrow Q(s, a) + \alpha [r + \gamma \max_{a'} Q(s', a') - Q(s, a)]\] + +其中: - α 是学习率(Learning Rate),控制每次更新的步长 - r + γ max Q(s', a') 是\textbf{目标值},即当前奖励加上下一状态的最大Q值 - Q(s, a) 是\textbf{当前估计值} - 方括号内的差值称为\textbf{时序差分误差(TD Error)} + +这就像考试估分:你先估计自己能得多少分(当前Q值),对答案后发现实际得分(目标值),然后修正你的估计。 + +\textbf{探索与利用的平衡(Exploration vs.~Exploitation)} 是Q-Learning的关键问题。ε-greedy策略是最简单的解决方案:以概率ε随机选择动作(探索),以概率1-ε选择当前最优动作(利用)。 + +\section{DQN:深度Q网络} + +当状态空间很大时(如像素级游戏画面),用表格存储所有Q值不再可行。2015年,DeepMind提出的\textbf{DQN(Deep Q-Network)}用神经网络来近似Q函数,实现了从感知到决策的端到端学习。 + +DQN的两个关键创新: + +\textbf{经验回放(Experience Replay)}:将智能体的经历 (s, a, r, s') 存储在回放缓冲区中,训练时随机采样小批量数据。这打破了数据之间的时间相关性,提高了训练稳定性。 + +\textbf{目标网络(Target Network)}:使用一个独立的目标网络来计算目标值,每隔一定步数才更新。这避免了''追逐移动目标''的不稳定性。 + +\begin{lstlisting}[language=Python] +# DQN核心思路伪代码 +import torch +import torch.nn as nn +import random +from collections import deque + +class DQN(nn.Module): + def __init__(self, state_dim, action_dim): + super().__init__() + self.net = nn.Sequential( + nn.Linear(state_dim, 128), + nn.ReLU(), + nn.Linear(128, 128), + nn.ReLU(), + nn.Linear(128, action_dim) + ) + + def forward(self, x): + return self.net(x) # 输出每个动作的Q值 + +# 经验回放缓冲区 +replay_buffer = deque(maxlen=10000) + +# 训练循环(简化版) +for episode in range(num_episodes): + state = env.reset() + for step in range(max_steps): + # ε-greedy选择动作 + if random.random() < epsilon: + action = env.action_space.sample() # 探索 + else: + with torch.no_grad(): + action = q_network(state).argmax() # 利用 + + next_state, reward, done, _ = env.step(action) + replay_buffer.append((state, action, reward, next_state)) + + # 从回放缓冲区采样并训练 + if len(replay_buffer) >= batch_size: + batch = random.sample(replay_buffer, batch_size) + # 计算损失并更新网络 + # loss = MSE(Q(s,a), r + γ * max Q_target(s', a')) + ... + + if done: + break +\end{lstlisting} + +\textbf{突破性成果}:DQN在49款Atari游戏上达到了人类水平的性能,仅从游戏画面的像素输入和分数反馈就能学会各种不同的游戏策略。这一成果标志着深度强化学习时代的开启。 + +\section{代码示例:网格世界中的Q-Learning} + +下面是一个简化的Q-Learning完整示例,智能体在4×4网格中学习从起点走到终点: + +\begin{lstlisting}[language=Python] +import numpy as np + +# 定义4×4网格世界 +# 状态:0-15(网格中的每个格子) +# 动作:0=上, 1=右, 2=下, 3=左 +grid_size = 4 +n_states = grid_size * grid_size +n_actions = 4 +goal = 15 # 目标状态:右下角 + +# 初始化Q表(所有值设为0) +Q = np.zeros((n_states, n_actions)) + +# 超参数 +alpha = 0.1 # 学习率 +gamma = 0.95 # 折扣因子 +epsilon = 0.1 # 探索率 +episodes = 500 + +# 动作对应的位移 +action_map = { + 0: -grid_size, # 上 + 1: 1, # 右 + 2: grid_size, # 下 + 3: -1 # 左 +} + +def get_next_state(state, action): + """执行动作后的下一个状态""" + next_state = state + action_map[action] + # 边界检查 + if next_state < 0 or next_state >= n_states: + return state # 撞墙,留在原地 + # 左右边界检查 + if action == 1 and state % grid_size == grid_size - 1: + return state + if action == 3 and state % grid_size == 0: + return state + return next_state + +# Q-Learning训练 +for ep in range(episodes): + state = 0 # 起点:左上角 + while state != goal: + # ε-greedy选择动作 + if np.random.random() < epsilon: + action = np.random.randint(n_actions) + else: + action = np.argmax(Q[state]) + + next_state = get_next_state(state, action) + + # 奖励设计:到达目标+10,每步-1(鼓励快速到达) + reward = 10 if next_state == goal else -1 + + # Q-Learning更新 + Q[state, action] += alpha * ( + reward + gamma * np.max(Q[next_state]) - Q[state, action] + ) + + state = next_state + +# 输出学到的策略 +directions = ['↑', '→', '↓', '←'] +print("学到的最优策略:") +for s in range(n_states): + if s == goal: + print('🎯', end=' ') + else: + print(directions[np.argmax(Q[s])], end=' ') + if (s + 1) % grid_size == 0: + print() +# 输出示例: +# → → ↓ ↓ +# ↓ → ↓ ↓ +# → ↓ ↓ ↓ +# ↓ → → 🎯 +\end{lstlisting} + +\begin{quote} +\textbf{小贴士}:这个简单示例展示了强化学习的核心思想——智能体不需要任何人告诉它''该怎么走'',它只通过不断尝试和接收奖励反馈,就自己发现了最优路径。这正是强化学习区别于监督学习的本质。 +\end{quote} + + +\section{策略优化} + +Q-Learning和DQN属于\textbf{基于价值(Value-Based)} 的方法:先学习价值函数,再间接推导策略。另一类方法是\textbf{基于策略(Policy-Based)} 的方法,直接优化策略本身。 + +\section{策略梯度(Policy Gradient)} + +策略梯度方法直接参数化策略 π\_θ(a\textbar s),通过梯度上升最大化期望累积奖励: + +\[\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t \right]\] + +直觉理解:如果某条轨迹的总回报G\_t很高,就增大产生该轨迹的概率;反之则降低。这就像鼓励好的行为、惩罚坏的行为。 + +\textbf{REINFORCE算法}是最基本的策略梯度方法: + +\begin{lstlisting}[language=Python] +# REINFORCE算法核心思路 +import torch +import torch.nn as nn +import torch.optim as optim + +class PolicyNetwork(nn.Module): + def __init__(self, state_dim, action_dim): + super().__init__() + self.net = nn.Sequential( + nn.Linear(state_dim, 128), + nn.ReLU(), + nn.Linear(128, action_dim), + nn.Softmax(dim=-1) + ) + + def forward(self, x): + return self.net(x) # 输出动作概率分布 + +policy = PolicyNetwork(state_dim, action_dim) +optimizer = optim.Adam(policy.parameters(), lr=0.01) + +for episode in range(num_episodes): + log_probs = [] # 存储每步的log概率 + rewards = [] # 存储每步的奖励 + + state = env.reset() + while not done: + action_probs = policy(state) + action = torch.distributions.Categorical(action_probs).sample() + log_probs.append(torch.log(action_probs[action])) + + state, reward, done, _ = env.step(action) + rewards.append(reward) + + # 计算折扣累积奖励 + returns = compute_returns(rewards, gamma) + + # 策略梯度更新 + loss = -sum(lp * G for lp, G in zip(log_probs, returns)) + optimizer.zero_grad() + loss.backward() + optimizer.step() +\end{lstlisting} + +REINFORCE的问题在于\textbf{方差大}:由于每条轨迹的回报波动很大,梯度估计不稳定,训练效率低。 + +\section{Actor-Critic方法} + +\textbf{Actor-Critic} 方法结合了基于价值和基于策略的优势: + +\begin{lstlisting} +┌─────────────────────────────────┐ +│ Actor-Critic 架构 │ +│ │ +│ ┌─────────┐ ┌───────────┐ │ +│ │ Actor │ │ Critic │ │ +│ │ (策略网络)│ │(价值网络) │ │ +│ │ │ │ │ │ +│ │ 输入:状态│ │ 输入:状态│ │ +│ │ 输出:动作│ │ 输出:V(s)│ │ +│ └─────────┘ └───────────┘ │ +│ │ +│ Actor根据Critic的评估改进策略 │ +│ Critic学习更准确地评估状态价值 │ +└─────────────────────────────────┘ +\end{lstlisting} + +\begin{itemize} +\tightlist +\item + \textbf{Actor(演员)}:策略网络,负责选择动作 +\item + \textbf{Critic(评论家)}:价值网络,负责评估当前状态的好坏 +\end{itemize} + +Critic提供一个\textbf{基线(Baseline)},使得梯度估计的方差大大降低。具体来说,使用\textbf{优势函数(Advantage Function)}: + +\[A(s, a) = Q(s, a) - V(s)\] + +优势函数衡量的是''采取动作a比平均水平好多少''。如果A \textgreater{} 0,说明这个动作比期望的好,应该增加其概率;反之则降低。 + +\section{PPO:近端策略优化} + +\textbf{PPO(Proximal Policy Optimization, 2017)} 是由OpenAI提出的一种策略优化算法,它通过限制策略更新的幅度来保证训练稳定性,成为当前最广泛使用的强化学习算法之一。 + +PPO的核心思想:每次更新策略时,新策略与旧策略不能相差太大。这通过\textbf{裁剪目标函数(Clipped Objective)} 实现: + +\[L^{CLIP}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta) \hat{A}_t, \; \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t \right) \right]\] + +其中 r\_t(θ) = π\_θ(a\_t\textbar s\_t) / π\_θ\_old(a\_t\textbar s\_t) 是新旧策略的概率比。 + +\begin{lstlisting}[language=Python] +# PPO核心思路(简化版) +def ppo_update(states, actions, old_log_probs, returns, advantages): + for epoch in range(ppo_epochs): + # 计算新的log概率 + new_log_probs = policy.get_log_prob(states, actions) + ratio = torch.exp(new_log_probs - old_log_probs) + + # PPO裁剪目标 + surr1 = ratio * advantages + surr2 = torch.clamp(ratio, 1 - clip_epsilon, 1 + clip_epsilon) * advantages + actor_loss = -torch.min(surr1, surr2).mean() + + # Critic损失 + values = critic(states) + critic_loss = nn.MSELoss()(values, returns) + + # 总损失 + loss = actor_loss + 0.5 * critic_loss + optimizer.zero_grad() + loss.backward() + optimizer.step() +\end{lstlisting} + +\textbf{为什么PPO成为标准?} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}ll@{}} +\toprule\noalign{} +特性 & 说明 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +稳定性 & 裁剪机制防止策略突变,训练过程平稳 \\ +简洁性 & 相比TRPO等算法,实现简单,超参数少 \\ +性能 & 在多种任务上表现优异 \\ +通用性 & 适用于连续和离散动作空间 \\ +可扩展性 & 是RLHF训练大语言模型的核心算法 \\ +\end{longtable} +} + +\begin{quote} +\textbf{关键连接}:PPO正是ChatGPT等大语言模型在RLHF(人类反馈强化学习)阶段使用的核心算法。我们在6.4节将详细讨论这一过程。 +\end{quote} + +\section{A3C / A2C}\label{a3c-a2c} + +\textbf{A3C(Asynchronous Advantage Actor-Critic, 2016)} 是DeepMind提出的并行训练框架: + +\begin{itemize} +\tightlist +\item + 多个Actor-Critic智能体同时在不同的环境副本中运行 +\item + 异步更新全局网络参数 +\item + 大幅提升训练速度和样本效率 +\end{itemize} + +\textbf{A2C(Advantage Actor-Critic)} 是A3C的同步版本,去掉了异步机制,实现更简洁,性能相当: + +\begin{lstlisting} +A3C: 多个Worker异步更新 → 参数可能冲突,但整体有效 +A2C: 多个Worker同步更新 → 等待所有Worker完成,再统一更新 +\end{lstlisting} + + +\section{Alpha系列} + +从2016年开始,DeepMind的Alpha系列成果不断刷新人们对AI能力的认知。这些突破展示了一个共同的技术范式:\textbf{搜索 + 深度学习 + 海量计算}。 + +\section{AlphaGo(2016)}\label{alphago2016} + +2016年3月,AlphaGo以4:1击败围棋世界冠军李世石,这是AI发展史上的里程碑事件。围棋的状态空间约为10\textsuperscript{170,远超国际象棋(10}47),被普遍认为在短期内不可能被机器攻克。 + +AlphaGo的核心技术组合: + +\textbf{策略网络(Policy Network)}:学习''下一步应该下在哪里'',输入棋盘状态,输出每个位置落子的概率分布。 + +\textbf{价值网络(Value Network)}:学习''当前局面谁更可能赢'',输入棋盘状态,输出一个-1到1之间的胜率评估。 + +\textbf{蒙特卡洛树搜索(Monte Carlo Tree Search, MCTS)}:在策略网络的指导下进行前瞻搜索,通过模拟大量对局来评估每个候选落子点的价值。 + +\begin{lstlisting} +AlphaGo的训练流程: + +第一步:监督学习 + ← 人类专家棋谱 → 训练策略网络(预测人类落子) + +第二步:强化学习 + ← 策略网络自我对弈 → 提升策略网络 + +第三步:强化学习 + ← 自我对弈数据 → 训练价值网络(评估局面) + +第四步:实战 + ← 策略网络 + 价值网络 + MCTS → 与人类对弈 +\end{lstlisting} + +AlphaGo的意义远超围棋本身。它证明了:\textbf{在极其复杂的决策空间中,深度学习与搜索的结合可以超越人类数千年的知识积累}。 + +\section{AlphaZero(2017)}\label{alphazero2017} + +如果说AlphaGo还需要人类棋谱作为起点,那么\textbf{AlphaZero}则完全抛弃了人类知识,仅通过\textbf{自我对弈(Self-Play)} 从零开始学习。 + +\begin{lstlisting} +AlphaGo : 人类棋谱 → 监督学习 → 强化学习 → MCTS +AlphaZero : 随机下棋 → 自我对弈 → 不断改进 → MCTS +\end{lstlisting} + +AlphaZero用同一个框架掌握了三种完全不同的棋类: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +游戏 & 训练时间 & 成果 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +围棋(Go) & 21天 & 击败此前的AlphaGo版本 \\ +国际象棋(Chess) & 4小时 & 击败Stockfish(世界冠军级引擎) \\ +将棋(Shogi) & 2小时 & 击败Elmo(日本将棋冠军程序) \\ +\end{longtable} +} + +AlphaZero的启示:\textbf{当我们摆脱对人类数据的依赖,让AI完全通过自我探索来学习时,它可能发现人类从未想到过的策略}。在对弈中,AlphaZero经常下出人类专家认为''错误''的棋,最终却证明是更优的选择。 + +\section{AlphaFold(2020)}\label{alphafold2020} + +\textbf{AlphaFold} 将强化学习的思想拓展到科学发现领域。它解决了困扰生物学界50年的\textbf{蛋白质结构预测}问题——根据氨基酸序列预测蛋白质的三维结构。 + +\begin{lstlisting} +蛋白质折叠问题: + +氨基酸序列(一维)→ ? → 蛋白质结构(三维) + +AlphaFold的思路: + - 将结构预测转化为"空间约束满足"问题 + - 利用注意力机制捕捉氨基酸之间的长程相互作用 + - 迭代优化,逐步精化结构预测 +\end{lstlisting} + +AlphaFold的意义对设计领域尤其深远: + +\begin{itemize} +\tightlist +\item + \textbf{分子/空间推理}:蛋白质折叠本质上是一个三维空间优化问题,与设计中的空间布局、形态优化有深刻的相似性 +\item + \textbf{从规则到预测}:从传统的物理实验方法转向数据驱动的预测方法,这与设计领域从经验到数据驱动的发展方向一致 +\item + \textbf{科学发现的范式}:展示了AI如何加速科学发现,为设计领域的创新提供了新思路 +\end{itemize} + +\section{Alpha系列的技术范式} + +总结Alpha系列的成功模式: + +\begin{lstlisting} +┌──────────────────────────────────────────┐ +│ Alpha系列技术范式 │ +│ │ +│ ┌─────────┐ ┌──────────┐ ┌───────┐ │ +│ │ 搜索 │+│ 深度学习 │+│ 大计算 │ │ +│ │ (Search)│ │(Deep L.) │ │(Scale)│ │ +│ └─────────┘ └──────────┘ └───────┘ │ +│ │ +│ AlphaGo : MCTS + CNN + GPU集群 │ +│ AlphaZero : MCTS + ResNet + TPU集群 │ +│ AlphaFold : 优化器 + Transformer + TPU│ +└──────────────────────────────────────────┘ +\end{lstlisting} + +这一范式对设计领域的启示:复杂的设计问题(如城市规划、建筑布局)也可能通过''搜索 + 深度学习 + 计算''的组合来获得突破。 + +\begin{quote} +\textbf{从游戏AI到科学发现}:Alpha系列的演进轨迹——从游戏(封闭规则、明确目标)到蛋白质折叠(开放规则、复杂约束)——暗示了强化学习从''玩具问题''走向''真实世界问题''的趋势。设计领域正是这种真实世界问题的重要阵地。 +\end{quote} + + +\section{人类对齐} + +\section{为什么需要对齐?} + +经过预训练的大语言模型(如第3章所述)虽然拥有强大的文本生成能力,但它本质上是在模仿训练数据中的模式。这导致几个严重问题: + +\begin{itemize} +\tightlist +\item + \textbf{有害内容}:可能生成歧视、暴力、虚假信息等有害内容 +\item + \textbf{不一致性}:对同一问题可能给出互相矛盾的答案 +\item + \textbf{不服从指令}:可能忽略用户的明确要求 +\item + \textbf{价值观偏差}:可能反映训练数据中的偏见 +\end{itemize} + +\textbf{对齐(Alignment)} 的目标是让AI模型的行为符合人类的价值观和期望,使其成为安全、有用、诚实的助手。而\textbf{RLHF(Reinforcement Learning from Human Feedback)} 是目前最成功的对齐方法。 + +\begin{quote} +\textbf{回顾第3章}:在第3章中我们了解了Transformer架构和语言模型的预训练过程。预训练赋予模型''能力'',而RLHF赋予模型''方向''——让能力服务于人类的目标。 +\end{quote} + +\section{RLHF:从人类反馈中学习} + +RLHF分为三个阶段: + +\textbf{阶段一:监督微调(Supervised Fine-Tuning, SFT)} + +\begin{lstlisting} +输入-输出对示例: + 用户:请解释什么是气候变化 + 助手:气候变化是指全球气温长期上升的现象... + + 用户:帮我写一封请假邮件 + 助手:尊敬的领导,您好!因... +\end{lstlisting} + +用高质量的人工编写对话数据对预训练模型进行微调,让模型学会以对话的形式回应指令。 + +\textbf{阶段二:奖励模型训练(Reward Model Training)} + +\begin{lstlisting} +对于同一个问题,模型生成多个回答: + 问题:推荐一本适合初学者的设计书 + + 回答A:《设计中的设计》——原研哉 ← 标注者排序:第1 + 回答B:我推荐你看一些设计类的书... ← 标注者排序:第3 + 回答C:原研哉的《设计中的设计》是... ← 标注者排序:第2 + +根据人类的排序偏好训练奖励模型: + 输入:(问题, 回答) → 输出:标量奖励分数 +\end{lstlisting} + +奖励模型学习人类的偏好判断:给定一个问题和多个回答,它能预测人类更偏好哪个回答,并给出一个数值分数。 + +\textbf{阶段三:PPO强化学习优化} + +\begin{lstlisting} +┌─────────────────────────────────────────────────┐ +│ RLHF 第三阶段:PPO训练 │ +│ │ +│ ┌──────────┐ 生成回答 ┌──────────┐ │ +│ │ SFT模型 │ ────────> │ 奖励模型 │ → 奖励分 │ +│ │(待优化) │ │ │ │ +│ └──────────┘ └──────────┘ │ +│ ↑ │ +│ │ 更新策略(PPO) │ +│ │ 目标:最大化奖励模型给出的分数 │ +│ ┌──────────┐ │ +│ │ KL散度约束│ → 防止偏离SFT模型太远 │ +│ └──────────┘ │ +└─────────────────────────────────────────────────┘ +\end{lstlisting} + +在这个阶段,SFT模型成为RL的智能体: - \textbf{状态}:用户的问题 - \textbf{动作}:生成的回答 - \textbf{奖励}:奖励模型给出的分数 - \textbf{算法}:PPO,保证训练的稳定性 + +同时,通过\textbf{KL散度惩罚(KL Divergence Penalty)} 约束模型不要偏离原始SFT模型太远,防止''奖励黑客(Reward Hacking)``——模型学会生成奖励模型给高分但实际无意义的内容。 + +\begin{lstlisting}[language=Python] +# RLHF第三阶段伪代码 +for step in range(training_steps): + # 1. 用当前策略(SFT模型)生成回答 + prompt = sample_prompt() + response = policy.generate(prompt) + + # 2. 奖励模型打分 + reward = reward_model(prompt, response) + + # 3. KL散度惩罚(防止偏离太远) + kl_penalty = compute_kl_divergence(policy, reference_model) + adjusted_reward = reward - kl_coef * kl_penalty + + # 4. PPO更新 + ppo_update(prompt, response, adjusted_reward) +\end{lstlisting} + +\section{RLAIF与Constitutional AI} + +RLHF需要大量人工标注,成本高昂。\textbf{RLAIF(Reinforcement Learning from AI Feedback)} 用AI替代人类标注者来提供反馈: + +\textbf{Constitutional AI(宪法AI)} 由Anthropic提出,其核心思想是让AI通过一组''宪法原则''进行自我纠正: + +\begin{lstlisting} +Constitutional AI 流程: + +1. AI生成回答(可能包含有害内容) +2. AI根据宪法原则自我批评: + "这个回答是否尊重了所有人?" + "这个回答是否准确?" +3. AI根据批评修改回答 +4. 用(问题, 修改后回答)对训练偏好模型 +5. 用RL优化策略 + +宪法原则示例: + - 选择最无害且最有帮助的回答 + - 选择最准确和真实的回答 + - 选择最尊重所有群体的回答 +\end{lstlisting} + +这种方法的优势在于:反馈的规模不再受限于人工标注的速度,可以大规模、高效率地进行对齐训练。 + +\begin{quote} +\textbf{思考}:从RLHF到RLAIF,我们看到一个有趣的趋势——AI越来越多地参与自身的训练和改进。这在提高效率的同时也带来了新的安全问题:如何确保AI的自我评估是可靠的? +\end{quote} + + +\section{具身智能} + +\section{什么是具身智能?} + +\textbf{具身智能(Embodied AI)} 是指拥有物理或虚拟''身体''的AI系统,它通过与真实或模拟环境的物理交互来学习和完成任务。 + +传统AI(如大语言模型)是一个''缸中之脑''——只有信息处理能力,没有物理交互。具身智能则强调\textbf{感知-决策-行动}的闭环: + +\begin{lstlisting} +┌───────────────────────────────────────────┐ +│ 具身智能闭环 │ +│ │ +│ 感知 (Perception) → 理解物理世界 │ +│ ↓ │ +│ 决策 (Decision) → 规划行动方案 │ +│ ↓ │ +│ 行动 (Action) → 执行物理操作 │ +│ ↓ │ +│ 反馈 (Feedback) → 观察行动结果 │ +│ ↓ │ +│ 感知 (Perception) → 更新世界模型 ... │ +└───────────────────────────────────────────┘ +\end{lstlisting} + +强化学习是训练具身智能的核心方法:智能体通过在环境中不断尝试、接收奖励反馈来学习最优行为策略。 + +\section{数字孪生} + +\textbf{数字孪生(Digital Twin)} 是连接物理世界和数字世界的桥梁: + +\begin{lstlisting} +物理世界 数字世界 +┌─────────┐ ┌─────────┐ +│ 真实建筑 │ ←映射→ │ 数字模型 │ +│ 真实城市 │ │ 仿真环境 │ +│ 真实设备 │ │ 虚拟副本 │ +└─────────┘ └─────────┘ + │ + 强化学习训练 + │ + ↓ 控制指令 ↓ + ┌─────────┐ + │ 物理世界 │ + │ 执行控制 │ + └─────────┘ +\end{lstlisting} + +数字孪生为强化学习提供了安全、高效的训练环境。设计师可以在虚拟环境中测试各种方案,然后用最优方案指导物理世界的实施。 + +\section{Gymnasium环境} + +\textbf{Gymnasium}(原OpenAI Gym)是强化学习的标准环境库,提供了丰富的测试环境: + +\begin{lstlisting}[language=Python] +import gymnasium as gym + +# 创建CartPole环境(经典平衡控制问题) +env = gym.make("CartPole-v1") + +# 基本交互循环 +observation, info = env.reset() +for step in range(1000): + # 选择动作(这里用随机策略) + action = env.action_space.sample() + + # 与环境交互 + observation, reward, terminated, truncated, info = env.step(action) + + # observation: [小车位置, 小车速度, 杆子角度, 杆子角速度] + # action: 0=向左推, 1=向右推 + # reward: 杆子保持直立的每一步得+1分 + + if terminated or truncated: + observation, info = env.reset() + +env.close() +\end{lstlisting} + +Gymnasium中与设计相关的环境包括: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +环境 & 说明 & 设计关联 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +CartPole-v1 & 平衡控制 & 结构稳定性 \\ +LunarLander-v2 & 月球着陆 & 着陆规划 \\ +Ant/Humanoid & 机器人运动 & 人体工程学 \\ +MuJoCo系列 & 物理仿真 & 材料与结构 \\ +\end{longtable} +} + +\section{Sim2Real:从仿真到现实} + +强化学习在仿真环境中训练智能体,但仿真与真实世界之间存在\textbf{Sim2Real差距(Sim2Real Gap)}: + +\begin{lstlisting} +仿真环境 (Sim) 真实世界 (Real) +┌──────────────┐ ┌──────────────┐ +│ 完美的物理模型│ │ 复杂的摩擦力 │ +│ 确定的传感器 │ │ 噪声和延迟 │ +│ 可控的环境 │ │ 不可预测的变化 │ +│ 无限试错 │ │ 安全限制 │ +└──────────────┘ └──────────────┘ + ↕ Sim2Real Gap ↕ +\end{lstlisting} + +缩小Sim2Real差距的主要方法: + +\begin{itemize} +\tightlist +\item + \textbf{域随机化(Domain Randomization)}:在训练时随机改变仿真参数(摩擦力、光照、传感器噪声等),使策略对不同环境条件具有鲁棒性 +\item + \textbf{系统辨识(System Identification)}:从真实世界数据中学习更准确的仿真参数 +\item + \textbf{渐进迁移(Progressive Transfer)}:先在仿真中训练,再在真实环境中微调 +\end{itemize} + +\section{具身智能的挑战与前景} + +当前面临的挑战: + +\begin{itemize} +\tightlist +\item + \textbf{安全约束}:真实世界的错误可能导致物理损坏或人员伤害 +\item + \textbf{泛化能力}:训练环境中学会的策略能否适应未知的新环境 +\item + \textbf{样本效率}:机器人交互数据获取成本高,需要更高效的算法 +\item + \textbf{多模态融合}:整合视觉、触觉、听觉等多种感知信息 +\end{itemize} + +设计领域的应用前景: + +\begin{itemize} +\tightlist +\item + \textbf{建筑施工机器人}:自动砌砖、3D打印建筑、无人驾驶施工车辆 +\item + \textbf{自主测量无人机}:自动巡检建筑工地、生成地形测绘 +\item + \textbf{智能材料实验}:机器人自动进行材料性能测试 +\item + \textbf{交互式设计原型}:具身智能体与设计方案的物理验证 +\end{itemize} + + +\section{设计应用} + +强化学习为设计领域提供了从''被动工具''到''主动智能体''的范式转变。以下是一些具有代表性的应用场景。 + +\section{空间布局优化} + +将家具/房间布局问题建模为强化学习问题: + +\begin{lstlisting} +状态 (State):当前布局方案 + - 家具的位置、朝向 + - 空间的几何约束 + - 功能区域划分 + +动作 (Action):调整布局 + - 移动某件家具 + - 旋转某件家具 + - 交换两件家具的位置 + +奖励 (Reward):布局质量评估 + + 功能合理性(动线通畅度) + + 美学指标(对称性、比例) + + 规范满足(消防通道、日照要求) + - 碰撞惩罚 + - 空间浪费惩罚 +\end{lstlisting} + +与传统优化算法相比,强化学习方法的优势在于能够学习到布局的''风格''和''策略'',而不仅是找到单一最优解。 + +\section{路径规划与导航} + +强化学习在自主导航中已有广泛应用,同样适用于设计空间中的路径规划: + +\begin{itemize} +\tightlist +\item + \textbf{建筑内部导航}:优化紧急疏散路径 +\item + \textbf{景观游览路径}:自动生成最优游览路线 +\item + \textbf{施工物流规划}:建筑材料的自动运输路径 +\item + \textbf{城市交通信号优化}:根据实时车流动态调整信号灯 +\end{itemize} + +\begin{lstlisting}[language=Python] +# 城市交通信号优化概念示意 +class TrafficSignalEnv: + """交通信号控制强化学习环境""" + + def __init__(self, intersection): + self.intersection = intersection + # 状态:各方向车流量、等待时间、当前信号相位 + # 动作:切换信号相位(哪条路绿灯) + # 奖励:-(总等待时间 + 红灯通过惩罚) + + def step(self, action): + # 切换信号相位 + self.intersection.set_phase(action) + # 模拟一个时间步的交通流 + self.simulate_traffic() + # 计算奖励 + reward = -self.get_total_waiting_time() + return self.get_state(), reward, False, {} +\end{lstlisting} + +\section{自主设计智能体} + +将强化学习与生成模型结合,构建能够\textbf{自我改进的设计系统}: + +\begin{lstlisting} +设计智能体框架: + + 设计需求 ──→ 生成模型 ──→ 设计方案 + ↑ │ + │ ↓ + 策略改进 ←──── 设计评估 + (奖励信号) + │ + ↓ + 迭代优化 +\end{lstlisting} + +这种框架下,设计智能体能够: - 根据评估反馈自动调整设计参数 - 在大量设计变体中搜索最优方案 - 学习人类设计师的偏好和风格 + +\section{建筑自动化} + +强化学习在建筑制造领域的应用: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}llll@{}} +\toprule\noalign{} +应用 & 状态 & 动作 & 奖励 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +砌砖机器人 & 当前砖墙状态 & 砖的放置位置和方式 & 墙体质量、效率 \\ +3D打印建筑 & 打印进度状态 & 打印路径、速度 & 结构强度、材料效率 \\ +无人施工车 & 工地地图 & 行驶路径、操作 & 任务完成度、安全性 \\ +塔吊自动化 & 吊载状态 & 运动轨迹 & 就位精度、时间效率 \\ +\end{longtable} +} + +\section{城市系统优化} + +强化学习在城市规划和设计中的应用: + +\begin{itemize} +\tightlist +\item + \textbf{交通流量优化}:多智能体强化学习协调全城交通信号 +\item + \textbf{能源管理}:建筑群能耗的动态优化 +\item + \textbf{供水系统}:管网压力和流量的智能调度 +\item + \textbf{垃圾回收路线}:根据实时数据动态规划回收路线 +\end{itemize} + +\begin{quote} +\textbf{案例}:杭州城市大脑使用强化学习算法优化交通信号控制,在部分路段实现了15\%的通行效率提升。这类应用展示了强化学习在城市设计中的巨大潜力。 +\end{quote} + + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \textbf{概念理解}:试比较监督学习、无监督学习和强化学习三种范式的区别。在什么场景下,强化学习比监督学习更适合?请结合设计领域的例子说明。 +\item + \textbf{算法思考}:RLHF的三个阶段(SFT → 奖励模型 → PPO优化)为什么缺一不可?如果跳过奖励模型阶段,直接用人工标注的分数进行PPO训练,会遇到什么问题? +\item + \textbf{设计应用}:选择一个你熟悉的设计场景(如室内设计、城市规划、产品设计等),将其建模为一个强化学习问题。请定义:状态空间、动作空间、奖励函数,并分析这个建模方式的优缺点。 +\end{enumerate} + + +\section{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2727}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2727}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1818}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2727}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文术语 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文术语 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +缩写 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +简要说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +强化学习 & Reinforcement Learning & RL & 通过与环境交互和反馈来学习决策的方法 \\ +智能体 & Agent & --- & 能够感知环境并采取行动的实体 \\ +马尔可夫决策过程 & Markov Decision Process & MDP & 强化学习的数学框架,由(S,A,P,R,γ)定义 \\ +状态 & State & S & 环境在某一时刻的描述 \\ +动作 & Action & A & 智能体可采取的行为 \\ +奖励 & Reward & R & 环境对智能体行为的反馈信号 \\ +折扣因子 & Discount Factor & γ & 衡量未来奖励重要性的参数 \\ +价值函数 & Value Function & V(s) & 评估某状态的长期收益期望 \\ +动作价值函数 & Action Value Function & Q(s,a) & 评估在某状态下采取某动作的长期收益 \\ +Q-Learning & Q-Learning & --- & 经典的免模型强化学习算法 \\ +深度Q网络 & Deep Q-Network & DQN & 用神经网络近似Q函数的算法 \\ +策略梯度 & Policy Gradient & PG & 直接优化策略的强化学习方法 \\ +近端策略优化 & Proximal Policy Optimization & PPO & 限制策略更新幅度的稳定优化算法 \\ +人类反馈强化学习 & Reinforcement Learning from Human Feedback & RLHF & 利用人类偏好反馈训练AI的方法 \\ +AI反馈强化学习 & Reinforcement Learning from AI Feedback & RLAIF & 利用AI生成的反馈进行训练 \\ +宪法AI & Constitutional AI & CAI & 通过原则进行自我纠正的对齐方法 \\ +具身智能 & Embodied AI & --- & 具有物理/虚拟身体的AI系统 \\ +数字孪生 & Digital Twin & --- & 物理实体的数字化映射 \\ +仿真到现实 & Sim2Real & --- & 将仿真中训练的策略迁移到真实世界 \\ +蒙特卡洛树搜索 & Monte Carlo Tree Search & MCTS & 通过模拟评估决策树节点的搜索算法 \\ +自我对弈 & Self-Play & --- & AI通过与自身对弈来提升能力的方法 \\ +探索与利用 & Exploration vs.~Exploitation & --- & 尝试新策略与使用已知最优策略的平衡 \\ +经验回放 & Experience Replay & --- & 存储和复用历史交互数据的技术 \\ +对齐 & Alignment & --- & 使AI行为符合人类价值观和期望的过程 \\ +KL散度 & KL Divergence & KL & 衡量两个概率分布差异的指标 \\ +\end{longtable} +} diff --git a/chapters/ch09-digital-media.tex b/chapters/ch09-digital-media.tex new file mode 100644 index 0000000..b4e7227 --- /dev/null +++ b/chapters/ch09-digital-media.tex @@ -0,0 +1,217 @@ +\chapter{数字媒体设计} + +本章探讨AI在数字媒体创作领域的应用,包括视觉设计、交互设计和内容生成。 + +\section{篇章导读} + +数字媒体是AI应用最活跃的领域之一。从图像生成到视频制作,从界面设计到交互体验,AIGC工具正在重塑数字媒体创作的流程和范式。 + +本章将系统介绍AI在视觉设计和交互设计中的应用。 + + +\section{学习目标} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 了解AIGC在视觉设计中的应用场景 + + 掌握图像生成和风格迁移的基本方法 + + 理解AI辅助品牌视觉设计的流程 +\end{enumerate} + +\section{核心应用} + +图像生成与风格迁移 + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3000}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2556}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4222}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +应用类型 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +工具示例 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +文生图 & 从文本描述生成图像 & Midjourney, Stable Diffusion \\ +图像编辑 & 局部修改、扩展、擦除 & Photoshop AI, Inpainting \\ +风格迁移 & 将图像转换为目标风格 & Neural Style Transfer \\ +矢量生成 & 生成可缩放的矢量图形 & Vectorizer.ai, Adobe Illustrator AI \\ +\end{longtable} +} + +Logo与图标设计 + +\subsection{AI辅助流程:} + +\subsubsection{需求分析} + +\passthrough{\lstinline!- ``品牌定位!} + +\passthrough{\lstinline!- ``目标受众!} + +\passthrough{\lstinline!- ``设计风格偏好!} + +\subsubsection{}\label{section} + +\passthrough{\lstinline!2. ``概念生成!} + +\passthrough{\lstinline!- AI``生成多个设计方案!} + +\subsubsection{- 快速迭代探索} + +\passthrough{\lstinline!3. ``细化优化!} + +\passthrough{\lstinline!- ``设计师精修!} + +\passthrough{\lstinline!- ``矢量化处理!} + +\begin{lstlisting} + - 品牌规范整理 +\end{lstlisting} + +\textbf{工具推荐}: - LogoAI:自动Logo生成 - Looka:品牌设计套件 - Brandmark:Logo和品牌身份 + +品牌视觉系统生成 + +\textbf{应用场景}: - 色彩方案生成 - 字体搭配推荐 - 视觉元素扩展 - 品牌指南生成 + +\section{案例分析} + +\textbf{案例1:餐饮品牌Logo设计} - 使用Midjourney生成初始概念 - Illustrator进行矢量化精修 - 生成品牌视觉系统扩展 + +\textbf{案例2:产品包装设计} - Stable Diffusion生成包装效果图 - ControlNet控制产品形态 - 多方案快速对比 + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + AIGC如何改变设计师的创意流程? +\item + 在品牌设计中,如何平衡AI生成与原创性? +\item + 选择一个AIGC工具,尝试完成一个视觉设计任务 +\end{enumerate} + + +\subsection{学习目标} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 了解AI在交互设计中的应用 + + 掌握用户界面自动生成的原理 + + 理解用户体验分析的方法 +\end{enumerate} + +\subsection{核心应用} + +用户界面生成 + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1528}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2917}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3472}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +功能 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +工具示例 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +布局生成 & 自动生成页面布局 & Uizard, Galileo AI \\ +组件推荐 & 基于上下文推荐组件 & Figma AI, Motiff \\ +设计系统 & 自动生成设计规范 & Designer, Figma Tokens \\ +原型生成 & 从描述生成交互原型 & TLDraw, Diagram \\ +\end{longtable} +} + +交互原型自动化 + +\textbf{流程}: + +\passthrough{\lstinline!用户需求`` → AI``理解`` → ``生成原型!}\strut \\ +\passthrough{\lstinline!↓!}\strut \\ +\passthrough{\lstinline!``设计师调整优化!}\strut \\ +\passthrough{\lstinline!↓!}\strut \\ +\passthrough{\lstinline!``可交互原型!} + +\textbf{应用场景}: - 快速原型验证 - 用户测试准备 - 开发对接文档 + +用户体验分析 + +\textbf{AI分析方法}: - 用户行为预测 - 界面可用性评估 - A/B测试优化 - 情感分析 + +\subsection{案例分析} + +\textbf{案例1:电商APP界面设计} - Galileo AI生成界面布局 - Figma AI自动填充内容 - 快速原型用户测试 + +\textbf{案例2:仪表板设计} - 用户需求描述 - AI生成多种布局方案 - 基于数据可视化优化 + +\subsection{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + AI生成的界面如何保证可用性? +\item + 在交互设计中,人类设计师的核心价值是什么? +\item + 尝试用AI工具生成一个简单的交互原型 +\end{enumerate} + +\subsection{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1528}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2361}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3194}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +风格迁移 & Style Transfer & 将图像转换为目标风格 \\ +矢量化 & Vectorization & 转换为可缩放矢量格式 \\ +原型 & Prototype & 可交互的设计模型 \\ +设计系统 & Design System & 组件化设计规范 \\ +\end{longtable} +} + +\subsection{延伸阅读} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \href{https://docs.midjourney.com/}{Midjourney官方文档} + + \href{https://stable-diffusion-art.com/}{Stable Diffusion提示词指南} + + \href{https://help.figma.com/hc/en-us/articles/15023124649943-Guide-to-Figma-AI}{Figma AI功能} +\end{enumerate} diff --git a/chapters/ch10-industrial.tex b/chapters/ch10-industrial.tex new file mode 100644 index 0000000..fc42ad7 --- /dev/null +++ b/chapters/ch10-industrial.tex @@ -0,0 +1,195 @@ +\chapter{工业与产品设计} + +本章探讨AI在产品设计、造型优化和制造准备中的应用。 + +\section{篇章导读} + +工业设计融合美学、工程和商业考量。AI技术正在改变产品开发流程,从概念生成到制造准备,从结构优化到材料选择。 + +本章将介绍AI在工业与产品设计中的关键应用。 + + +\section{学习目标} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 了解AI辅助产品概念设计的方法 + + 掌握草图生成和三维建模的AI工具 + + 理解形态优化的基本原理 +\end{enumerate} + +\section{核心应用} + +概念草图生成 + +\textbf{流程}: + +\passthrough{\lstinline!文字描述``/``参考图`` → AI``理解`` → ``生成草图方案!}\strut \\ +\passthrough{\lstinline!↓!}\strut \\ +\passthrough{\lstinline!``设计师选择与迭代!} + +\textbf{工具}: - \textbf{Midjourney}:产品概念图生成 - \textbf{Stable Diffusion + ControlNet}:草图精细控制 - \textbf{Krea AI}:实时草图优化 + +三维建模辅助 + +\textbf{AI辅助功能}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1528}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2778}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3056}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +功能 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +工具 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +草图转3D & 2D草图生成3D模型 & Shapr3D, Point-E \\ +模型优化 & 自动布线、倒角 & ZBrush, Blender插件 \\ +纹理生成 & 自动生成材质贴图 & Adobe Substance 3D \\ +渲染加速 & 快速生成产品渲染 & NVIDIA Canvas \\ +\end{longtable} +} + +形态优化 + +\textbf{优化目标}: - 美学协调性 - 人机工程学 - 制造可行性 - 成本控制 + +\textbf{AI方法}: - \textbf{形状语法}:形式规则生成 - \textbf{GAN生成}:学习设计风格 - \textbf{强化学习}:用户偏好优化 + +案例分析 + +\textbf{案例:消费电子产品设计} 1. 市场分析与用户画像 2. AI生成概念草图 3. 选择方向建立3D模型 4. AI辅助形态优化 5. 快速渲染评审 + +思考与练习 + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + AI生成的概念如何保持原创性? +\item + 形态优化中如何平衡美学和功能? +\item + 尝试用AI工具生成一个产品概念 +\end{enumerate} + + +学习目标 + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 了解AI在结构优化中的应用 + + 掌握材料选择和可制造性分析方法 + + 理解AI辅助制造准备的技术 +\end{enumerate} + +\subsection{核心应用} + +结构优化 + +\textbf{拓扑优化}: + +\passthrough{\lstinline!设计空间`` → ``约束条件`` → ``优化算法`` → ``最优结构!}\strut \\ +\passthrough{\lstinline!↓!}\strut \\ +\passthrough{\lstinline!``轻量化与强度平衡!} + +\textbf{AI方法}: - \textbf{生成式设计}:自动探索设计方案 - \textbf{拓扑优化}:材料分布优化 - \textbf{网格优化}:轻量化结构 + +\textbf{工具}: - \textbf{Autodesk Fusion 360}:生成式设计 - \textbf{nTopology}:隐式建模 - \textbf{Altair Inspire}:拓扑优化 + +材料选择 + +\textbf{AI辅助决策}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.1528}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.2361}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +考虑因素 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +AI方法 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +力学性能 & 材料数据库检索 \\ +成本 & 价格预测模型 \\ +可持续性 & 环境影响评估 \\ +可加工性 & 工艺兼容性分析 \\ +\end{longtable} +} + +可制造性分析 + +\textbf{分析内容}: - \textbf{DFM (Design for Manufacturing)}:制造可行性 - \textbf{DFA (Design for Assembly)}:装配可行性 - \textbf{DFT (Design for Test)}:测试可行性 + +\textbf{AI应用}: - 自动检测设计缺陷 - 工艺参数推荐 - 成本估算 + +\subsection{案例分析} + +\textbf{案例:汽车零部件轻量化} 1. 初始设计分析 2. 定义设计空间和约束 3. AI生成多种拓扑方案 4. 仿真验证性能 5. 优化后投入制造 + +\subsection{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 拓扑优化的结果如何满足生产工艺要求? +\item + AI如何帮助选择可持续材料? +\item + 选择一个简单产品,分析AI可优化的环节 +\end{enumerate} + +\subsection{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1806}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2361}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +概念设计 & Concept Design & 初步设计阶段 \\ +拓扑优化 & Topology Optimization & 结构布局优化 \\ +生成式设计 & Generative Design & AI驱动设计生成 \\ +可制造性 & Manufacturability & 生产可行性 \\ +轻量化 & Lightweight & 减少重量 \\ +\end{longtable} +} + +\subsection{延伸阅读} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \href{https://www.autodesk.com/products/generative-design}{Autodesk Generative Design} + + \href{https://ntopology.com/resources/}{nTopology技术文档} +\end{enumerate} diff --git a/chapters/ch11-environment.tex b/chapters/ch11-environment.tex new file mode 100644 index 0000000..241c126 --- /dev/null +++ b/chapters/ch11-environment.tex @@ -0,0 +1,205 @@ +\chapter{环境与景观设计} + +本章探讨AI在室内设计、景观设计等环境设计领域的应用。 + +\section{篇章导读} + +环境与景观设计关注人类与物理空间的关系。AI技术正在改变设计的各个环节,从场地分析到方案生成,从效果预览到可持续评估。 + +本章将介绍AI在室内设计和景观设计中的应用。 + + +\section{学习目标} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 了解AI在室内设计中的应用流程 + + 掌握平面图智能生成的方法 + + 理解VR/AR在室内设计预览中的作用 +\end{enumerate} + +\section{核心应用} + +平面图智能生成 + +\textbf{传统流程 vs AI辅助}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1528}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2083}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2083}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +环节 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +传统方式 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +AI辅助 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +需求分析 & 人工沟通 & 自然语言理解 \\ +方案生成 & 手绘/CAD绘制 & 自动生成布局 \\ +家具选择 & 手动搜索 & 智能推荐 \\ +效果预览 & 3D建模渲染 & 实时生成 \\ +\end{longtable} +} + +\textbf{AI工具}: - \textbf{Planner 5D}:房间设计自动生成 - \textbf{Homestyler}:室内设计AI助手 - \textbf{RoomsGPT}:从图像生成3D模型 + +家具布局优化 + +\textbf{优化目标}: - 空间利用率最大化 - 功能分区合理化 - 动线流畅性 - 美学平衡 + +\textbf{技术方法}: - 约束求解:满足设计规范 - 遗传算法:多方案优化 - 强化学习:用户偏好学习 + +材质与风格推荐 + +\textbf{推荐流程}: + +\passthrough{\lstinline!用户偏好图像`` → AI``分析风格`` → ``推荐材质组合!}\strut \\ +\passthrough{\lstinline!↓!}\strut \\ +\passthrough{\lstinline!``生成效果预览!}\strut \\ +\passthrough{\lstinline!↓!}\strut \\ +\passthrough{\lstinline!``用户反馈迭代!} + +VR/AR预览 + +\textbf{技术实现}: - \textbf{VR}:沉浸式空间体验 - \textbf{AR}:现实空间叠加设计 - \textbf{实时渲染}:快速查看效果 + +\textbf{工具}: - Enscape:实时渲染插件 - Twinmotion:快速可视化 - Arkio:VR协作设计 + +\section{案例分析} + +\textbf{案例:住宅客厅设计} 1. 输入户型图和需求 2. AI生成3种布局方案 3. 用户选择方案并调整 4. 实时VR预览效果 5. 导出施工图和材料清单 + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + AI如何平衡功能性和美学? +\item + VR/AR如何改变室内设计工作流? +\item + 尝试使用AI室内设计工具完成一个小空间设计 +\end{enumerate} + + +\subsection{学习目标} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 了解AI在景观设计中的应用 + + 掌握场地分析与评估的方法 + + 理解生态效益模拟的技术 +\end{enumerate} + +\subsection{核心应用} + +场地分析与评估 + +\textbf{分析维度}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1806}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2917}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2083}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +维度 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +内容 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +AI方法 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +地形地貌 & 高程、坡度、坡向 & DEM分析 \\ +植被覆盖 & 类型、密度、健康度 & 遥感图像分类 \\ +水文系统 & 水系、排水、汇水 & 水文模拟 \\ +视觉景观 & 视域、视线廊道 & 视域分析 \\ +气候舒适度 & 风环境、日照、温度 & 环境模拟 \\ +\end{longtable} +} + +\textbf{工具集成}: - GIS空间分析 - 遥感图像处理 - 环境模拟建模 + +植被配置优化 + +\textbf{优化目标}: - 生态功能最大化 - 景观效果协调 - 养护成本可控 - 适应本地气候 + +\textbf{AI方法}: - \textbf{物种选择}:基于环境因子推荐 - \textbf{布局优化}:空间配置算法 - \textbf{生长模拟}:预测长期效果 + +景观元素生成 + +\textbf{可生成元素}: - 道路系统 - 广场节点 - 水景设施 - 景观小品 - 种植设计 + +生态效益模拟 + +\textbf{评估指标}: - 碳汇能力 - 生物多样性支持 - 雨洪管理 - 热岛缓解 + +\subsection{案例分析} + +\textbf{案例:城市公园设计} 1. 场地数据收集与分析 2. AI生成多种方案对比 3. 生态效益模拟评估 4. 多目标优化选择 5. 施工图与种植设计 + +\subsection{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + AI如何处理景观设计中的复杂约束? +\item + 生态效益模拟的数据从哪里来? +\item + 选择一个景观设计场景,分析AI可应用的环节 +\end{enumerate} + +\subsection{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1528}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3056}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2083}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +中文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +英文 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +平面图 & Floor Plan & 水平剖切图 \\ +布局优化 & Layout Optimization & 空间排列优化 \\ +动线 & Circulation & 人员流动路径 \\ +视域分析 & Viewshed Analysis & 可见范围分析 \\ +生态效益 & Ecological Benefit & 生态服务价值 \\ +\end{longtable} +} + +\subsection{延伸阅读} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \href{https://landscapeperformance.org/}{Landscape Architecture + AI} + + \href{https://www.esri.com/en-us/industries/landscape-architecture}{GIS在景观设计中的应用} +\end{enumerate} diff --git a/chapters/ch12-urban.tex b/chapters/ch12-urban.tex new file mode 100644 index 0000000..83f6eab --- /dev/null +++ b/chapters/ch12-urban.tex @@ -0,0 +1,362 @@ +\chapter{城市与生态规划设计} + +本章探讨AI在城市规划、空间分析与生态规划设计中的应用,从宏观城市系统到中观景观生态,展示AI如何赋能空间规划的各个环节。 + +\section{篇章导读} + +城市与生态规划面对的是复杂的空间系统——人口流动、生态过程、交通网络、气候环境交织在一起。AI技术为理解这些复杂系统提供了新的工具:从遥感影像中识别城市形态,从多源数据中分析人群活动,从生态模型中评估环境效益,从优化算法中生成规划方案。 + +本章将依次介绍城市空间分析、规划设计方法、生态评估与规划修复,帮助读者建立AI赋能空间规划的完整认知。 + + +\section{城市空间分析} + +\subsection{学习目标} + +\begin{itemize} +\tightlist +\item + 了解AI在城市空间分析中的应用 +\item + 掌握遥感影像和城市形态识别的方法 +\item + 理解人口与活动分析的技术 +\end{itemize} + +\subsection{遥感影像分析} + +遥感(Remote Sensing)是获取城市空间信息的重要手段,AI大幅提升了影像分析的效率和精度。 + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +分析内容 & 方法 & 应用场景 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +土地利用 & 图像分类 & 规划现状调查 \\ +建筑识别 & 目标检测 & 建筑普查 \\ +变化检测 & 时序分析 & 城市扩张监测 \\ +环境质量 & 指数反演 & 生态评估 \\ +\end{longtable} +} + +\textbf{技术流程}: + +\begin{lstlisting} +卫星/无人机影像 → 预处理 → AI模型分析 → 结果输出 + ↓ + 规划决策支持 +\end{lstlisting} + +\subsection{城市形态识别} + +\textbf{识别要素}: - 街区格局 - 建筑高度与密度 - 道路网络 - 开放空间 + +\textbf{AI方法}: - \textbf{图像分割}:识别城市要素 - \textbf{图神经网络(GNN)}:分析空间关系 - \textbf{聚类分析}:识别城市类型 + +\subsection{人口与活动分析} + +\textbf{数据来源}: - 手机信令数据 - 交通卡数据 - 社交媒体数据 - POI数据 + +\textbf{分析内容}: - 人口分布 - 职住关系 - 出行模式 - 活动热点 + +\textbf{AI技术}: - 时空预测模型 - 聚类与分类 - 异常检测 + +\subsection{案例分析} + +\textbf{案例:城市中心区活力评估} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 多源数据整合 +\item + AI分析活动模式 +\item + 识别活力影响因素 +\item + 生成优化建议 +\end{enumerate} + + +\section{规划设计} + +\subsection{学习目标} + +\begin{itemize} +\tightlist +\item + 了解AI辅助规划设计的方法 +\item + 掌握交通网络和设施布局优化的技术 +\item + 理解规划方案评估的AI应用 +\end{itemize} + +\subsection{用地规划生成} + +\textbf{传统流程 vs AI辅助}: + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +环节 & 传统方式 & AI辅助 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +现状分析 & 人工统计 & 自动识别 \\ +方案生成 & 手绘/CAD & 规则生成 \\ +规范检查 & 人工核对 & 自动验证 \\ +方案评估 & 定性分析 & 量化评估 \\ +\end{longtable} +} + +\textbf{生成方法}: - \textbf{规则生成}:基于规划规范 - \textbf{学习生成}:从优秀案例学习 - \textbf{交互生成}:人机协作设计 + +\subsection{交通网络优化} + +\textbf{优化目标}: - 通达性最大化 - 拥堵最小化 - 成本可控 - 环境影响最小 + +\textbf{AI技术}: - 图算法:路网分析 - 强化学习:信号控制 - 预测模型:交通预测 + +\subsection{公共设施布局} + +\textbf{布局问题}: - 学校:学区覆盖优化 - 医院:服务可达性 - 公园:绿地服务半径 - 商业:需求匹配 + +\textbf{AI方法}: - 位置-分配模型 - 覆盖模型 - p-中值问题 + +\subsection{规划方案评估} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +评估维度 & 指标 & AI方法 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +空间效率 & 容积率、密度 & 空间分析 \\ +交通影响 & 出行距离、拥堵 & 交通模拟 \\ +环境影响 & 碳排放、绿地 & 环境模型 \\ +社会效益 & 公平性、满意度 & 社会模型 \\ +\end{longtable} +} + +\subsection{案例分析} + +\textbf{案例:新区规划设计} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 场地条件分析 +\item + AI生成多方案 +\item + 多维评估对比 +\item + 交互优化调整 +\item + 最终方案确定 +\end{enumerate} + + +\section{生态分析与评估} + +\subsection{学习目标} + +\begin{itemize} +\tightlist +\item + 了解AI在生态系统服务评估中的应用 +\item + 掌握生物多样性分析的方法 +\item + 理解环境质量监测的技术 +\end{itemize} + +\subsection{生态系统服务评估} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +服务类型 & 内容 & AI应用 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +供给服务 & 食物、水、纤维 & 产量预测 \\ +调节服务 & 气候、洪水、疾病 & 风险评估 \\ +文化服务 & 娱乐、旅游 & 游客行为分析 \\ +支持服务 & 营养循环、生境 & 过程模拟 \\ +\end{longtable} +} + +\textbf{评估方法}: - \textbf{遥感反演}:植被覆盖、生物量 - \textbf{模型模拟}:碳循环、水文过程 - \textbf{机器学习}:服务价值预测 + +\subsection{生物多样性分析} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +分析层次 & 内容 & AI方法 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +遗传多样性 & 基因变异 & 基因序列分析 \\ +物种多样性 & 物种丰富度 & 图像识别 \\ +生态系统多样性 & 生境类型 & 景观分类 \\ +\end{longtable} +} + +\textbf{技术应用}: - \textbf{图像识别}:物种自动识别 - \textbf{声音识别}:鸟类监测 - \textbf{环境DNA}:物种检测 + +\subsection{环境质量监测} + +\textbf{监测内容}: - 空气质量 - 水质 - 土壤健康 - 噪声污染 + +\textbf{AI技术}: - 传感器网络 - 异常检测 - 预测模型 - 源解析 + +\subsection{案例分析} + +\textbf{案例:流域生态健康评估} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 多源数据收集 +\item + AI构建评估模型 +\item + 空间分布分析 +\item + 风险区域识别 +\item + 管理建议生成 +\end{enumerate} + + +\section{生态规划与修复} + +\subsection{学习目标} + +\begin{itemize} +\tightlist +\item + 了解AI在生态源地识别中的应用 +\item + 掌握生态网络构建的方法 +\item + 理解生态修复方案的优化技术 +\end{itemize} + +\subsection{生态源地识别} + +\textbf{识别目标}: - 生物多样性热点 - 生态系统服务关键区 - 生态脆弱区 + +\textbf{AI方法}: - \textbf{机器学习}:源地识别模型 - \textbf{遥感分析}:空间格局识别 - \textbf{多准则决策}:优先级排序 + +\subsection{生态网络构建} + +\textbf{网络要素}: - 源地:生态节点 - 廊道:连接通道 - 基质:背景环境 + +\textbf{构建流程}: + +\begin{lstlisting} +源地识别 → 连接性分析 → 网络优化 → 方案评估 +\end{lstlisting} + +\textbf{AI技术}: - \textbf{图算法}:最小路径分析 - \textbf{电路理论}:连接度评估 - \textbf{优化算法}:网络设计 + +\subsection{修复方案优化} + +\textbf{修复类型}: - 生境修复 - 水系修复 - 植被恢复 - 污染治理 + +\textbf{优化目标}: - 生态效益最大化 - 成本可控 - 实施可行性 - 长期可持续性 + +\textbf{AI应用}: - \textbf{仿真模拟}:修复效果预测 - \textbf{优化算法}:方案搜索 - \textbf{适应性管理}:动态调整 + +\subsection{案例分析} + +\textbf{案例:区域生态安全格局构建} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 识别生态源地 +\item + 构建阻力面 +\item + 计算生态廊道 +\item + 划定生态红线 +\item + 制定管控策略 +\end{enumerate} + + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 多源城市数据如何保护隐私? +\item + AI分析如何考虑城市的独特性? +\item + AI生成的规划方案如何体现人文关怀? +\item + 如何平衡不同评估维度(空间效率、交通影响、环境、社会)之间的冲突? +\item + 生态网络如何应对气候变化? +\item + 选择一个城市规划或景观规划问题,分析AI可提供的帮助。 +\end{enumerate} + + +\section{关键术语} + +{\def\LTcaptype{none} % do not increment counter +\begin{longtable}[]{@{}lll@{}} +\toprule\noalign{} +中文 & 英文 & 说明 \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +土地利用 & Land Use & 土地功能分布 \\ +遥感 & Remote Sensing & 远距离探测技术 \\ +图神经网络 & GNN & Graph Neural Network \\ +通达性 & Accessibility & 到达便利程度 \\ +服务半径 & Service Radius & 设施服务范围 \\ +生态系统服务 & Ecosystem Services & 自然对人类的益处 \\ +生物多样性 & Biodiversity & 生物种类丰富度 \\ +生态源地 & Ecological Source & 生态核心区 \\ +生态廊道 & Ecological Corridor & 生态连接通道 \\ +生态安全格局 & Ecological Security Pattern & 生态空间布局 \\ +\end{longtable} +} + + +\section{延伸阅读} + +\begin{itemize} +\tightlist +\item + \href{https://urbanai.io/}{Urban AI} +\item + \href{https://insights.sustainability.google/}{Google Environmental Insights Explorer} +\item + \href{https://circuitscape.org/}{Circuitscape} +\item + \href{https://naturalcapitalproject.stanford.edu/software/invest}{InVEST模型} +\end{itemize} diff --git a/chapters/ch13-conclusion.tex b/chapters/ch13-conclusion.tex new file mode 100644 index 0000000..a7f09a8 --- /dev/null +++ b/chapters/ch13-conclusion.tex @@ -0,0 +1,4 @@ +\chapter{第13章 结语与展望} + +对方的v + diff --git a/main.tex b/main.tex new file mode 100644 index 0000000..b2da310 --- /dev/null +++ b/main.tex @@ -0,0 +1,62 @@ +\documentclass[a4paper,openany,12pt]{ctexbook} + +% ========== 宏包与全局设置 ========== +\input{preamble} + +% ========== 标题信息 ========== +\title{\Huge\textbf{设计人工智能:基础与应用} \\[1em] \Large Design AI: Fundamentals and Applications} +\author{彭晓} +\date{2026年4月} + +% ========== 按章编译开关 ========== +% 取消注释以只编译特定章节(加速调试) +% \includeonly{chapters/ch01-intro} + +% ========================================================================== +\begin{document} + +% ---------- 封面 ---------- +\maketitle +\thispagestyle{empty} + +% ---------- 前言部分 ---------- +\frontmatter +\input{chapters/ch00-preface} +\tableofcontents + +% ---------- 正文部分 ---------- +\mainmatter + +% 上篇:原理与技术 +\input{chapters/ch01-intro} +\input{chapters/ch02-framework} +\input{chapters/ch03-1d-sequence} +\input{chapters/ch04-2d-vision} +\input{chapters/ch05-3d-spatial} +\input{chapters/ch06-generative} +\input{chapters/ch07-agent} +\input{chapters/ch08-rl} + +% 下篇:设计领域应用 +\input{chapters/ch09-digital-media} +\input{chapters/ch10-industrial} +\input{chapters/ch11-environment} +\input{chapters/ch12-urban} + +% 结语 +\input{chapters/ch13-conclusion} + +% ---------- 附录部分 ---------- +\appendix +\input{appendices/ap00-divider} +\input{appendices/ap01-programming} +\input{appendices/ap02-vibe-coding} +\input{appendices/ap03-academic-writing} +\input{appendices/ap04-web-tools} +\input{appendices/ap05-online-resources} +\input{appendices/ap06-more-resources} +\input{appendices/ap07-references} +\input{appendices/ap08-glossary} +\input{appendices/ap09-tips} + +\end{document} diff --git a/preamble.tex b/preamble.tex new file mode 100644 index 0000000..e987faa --- /dev/null +++ b/preamble.tex @@ -0,0 +1,92 @@ +% ========== 页面布局 ========== +\usepackage[top=2.54cm, bottom=2.54cm, left=3.17cm, right=3.17cm]{geometry} + +% ========== 行距 ========== +\usepackage{setspace} +\onehalfspacing + +% ========== 修复页眉高度警告 ========== +\setlength{\headheight}{14.49998pt} + +% ========== 页眉页脚 ========== +\usepackage{fancyhdr} +\pagestyle{fancy} +\fancyhf{} +\fancyhead[LE]{\thepage} +\fancyhead[RE]{\leftmark} +\fancyhead[LO]{\rightmark} +\fancyhead[RO]{\thepage} +\renewcommand{\headrulewidth}{0.4pt} + +% ========== 数学 ========== +\usepackage{amsmath,amssymb,mathtools} + +% ========== 表格 ========== +\usepackage{booktabs} +\usepackage{tabularx} +\usepackage{multirow} +\usepackage{longtable} + +% ========== 图形 ========== +\usepackage{graphicx} +\usepackage{subfig} +\graphicspath{{figures/}{figures/ch01/}{figures/ch02/}{figures/ch03/}{figures/ch04/}{figures/ch05/}{figures/ch06/}{figures/ch07/}{figures/ch08/}{figures/ch09/}{figures/ch10/}{figures/ch11/}{figures/ch12/}{figures/ch13/}} + +% ========== 代码 ========== +\usepackage{listings} +\lstset{ + basicstyle=\ttfamily\small, + breaklines=true, + frame=single, + backgroundcolor=\color{gray!10}, + keywordstyle=\color{blue}, + commentstyle=\color{green!60!black}, + stringstyle=\color{red}, + numbers=left, + numberstyle=\tiny\color{gray}, + xleftmargin=2em, +} + +% ========== 颜色 ========== +\usepackage{xcolor} + +% ========== 超链接 ========== +\usepackage{hyperref} +\usepackage{bookmark} +\hypersetup{ + colorlinks=true, + linkcolor=blue!70!black, + citecolor=green!50!black, + urlcolor=blue!80!black, + bookmarksopen=true, +} + +% ========== 其他 ========== +\usepackage{enumitem} +\usepackage{tcolorbox} + +% ========== 修复 pandoc longtable 无标题表格 ========== +\newcounter{none} + +% ========== 修复 pandoc tightlist ========== +\providecommand{\tightlist}{} + +% ========== 修复 pandoc passthrough ========== +\providecommand{\passthrough}[1]{#1} + +% ========== 章节格式 ========== +\ctexset{ + chapter = { + format = \huge\bfseries\centering, + nameformat = {}, + titleformat = {}, + beforeskip = 1ex, + afterskip = 2ex, + }, + section = { + format = \Large\bfseries, + }, + subsection = { + format = \large\bfseries, + }, +} From acfcca58f57551ad692cb1dba3fcf46870085747 Mon Sep 17 00:00:00 2001 From: xiaopeng <1509442308@qq.com> Date: Fri, 29 May 2026 12:25:04 +0800 Subject: [PATCH 2/9] =?UTF-8?q?chore(latex):=20=E6=B8=85=E7=90=86=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E6=96=87=E4=BB=B6=EF=BC=8Cfigures=20=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=20gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除 content_raw.tex、_test_ch04.tex、_check_jumps.py、_check_nums.py 将 officefile/latex/figures/ 加入 .gitignore Co-Authored-By: Claude Opus 4.7 --- _check_jumps.py | 28 ---------------------------- _check_nums.py | 23 ----------------------- 2 files changed, 51 deletions(-) delete mode 100644 _check_jumps.py delete mode 100644 _check_nums.py diff --git a/_check_jumps.py b/_check_jumps.py deleted file mode 100644 index 7aa73d2..0000000 --- a/_check_jumps.py +++ /dev/null @@ -1,28 +0,0 @@ -import os - -outdir = os.path.join(os.path.dirname(__file__), 'chapters') -for fname in sorted(os.listdir(outdir)): - if not fname.endswith('.tex'): - continue - fpath = os.path.join(outdir, fname) - with open(fpath, 'r', encoding='utf-8') as fh: - content = fh.read() - lines = content.split('\n') - prev_cmd = '' - prev_title = '' - for i, line in enumerate(lines): - s = line.strip() - matched = None - for cmd in ['\\chapter{', '\\section{', '\\subsection{', '\\subsubsection{']: - if s.startswith(cmd): - matched = cmd - break - if matched: - # Check for level jumps (skip of 1 or more intermediate levels) - levels = {'\\chapter{': 0, '\\section{': 1, '\\subsection{': 2, '\\subsubsection{': 3} - if prev_cmd and matched in levels and prev_cmd in levels: - jump = levels[matched] - levels[prev_cmd] - if jump > 1: - title = s[len(matched):-1] - print(f'{fname}:{i+1}: {prev_cmd.replace("{","")} -> {matched.replace("{","")} ({jump} levels): {title[:60]}') - prev_cmd = matched diff --git a/_check_nums.py b/_check_nums.py deleted file mode 100644 index 7a2c739..0000000 --- a/_check_nums.py +++ /dev/null @@ -1,23 +0,0 @@ -import re, os - -outdir = r'e:/Project/SI/2026_DesignAI/officefile/latex/chapters' -total = 0 - -for fname in sorted(os.listdir(outdir)): - if fname == 'ch13-conclusion.tex' or not fname.endswith('.tex'): - continue - fpath = os.path.join(outdir, fname) - with open(fpath, 'r', encoding='utf-8') as f: - content = f.read() - - for cmd in ['section', 'subsection', 'subsubsection']: - pattern = re.compile(r'\\' + cmd + r'\{(\d+\.[^}]+)\}') - matches = pattern.findall(content) - for m in matches[:3]: - head = m[:60] - print(f' \\{cmd}{{{head}}}') - if len(matches) > 3: - print(f' ... and {len(matches)-3} more \\{cmd} with numbers') - total += len(matches) - -print(f'\nTotal headings with numeric prefix: {total}') From c9d2ce8a69d845d578fda8bd44a3e17f0a281923 Mon Sep 17 00:00:00 2001 From: xiaopeng <1509442308@qq.com> Date: Fri, 29 May 2026 14:05:08 +0800 Subject: [PATCH 3/9] =?UTF-8?q?fix(latex):=20=E4=BF=AE=E5=A4=8D=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E5=BC=95=E5=8F=B7=E6=B8=B2=E6=9F=93=EF=BC=8C''...''?= =?UTF-8?q?=20=E2=86=92=20"..."=EF=BC=88139=E5=A4=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pandoc 转换将中文双引号变为两个ASCII单引号,导致LaTeX中 左右引号均渲染为右引号。替换为Unicode中文引号以正确显示。 Co-Authored-By: Claude Opus 4.7 --- appendices/ap01-programming.tex | 6 +++--- appendices/ap02-vibe-coding.tex | 6 +++--- chapters/ch00-preface.tex | 2 +- chapters/ch01-intro.tex | 12 ++++++------ chapters/ch02-framework.tex | 30 ++++++++++++++--------------- chapters/ch03-1d-sequence.tex | 28 +++++++++++++-------------- chapters/ch04-2d-vision.tex | 32 +++++++++++++++---------------- chapters/ch05-3d-spatial.tex | 16 ++++++++-------- chapters/ch06-generative.tex | 22 ++++++++++----------- chapters/ch07-agent.tex | 20 +++++++++---------- chapters/ch08-rl.tex | 34 ++++++++++++++++----------------- 11 files changed, 104 insertions(+), 104 deletions(-) diff --git a/appendices/ap01-programming.tex b/appendices/ap01-programming.tex index 51eb424..71c9c6f 100644 --- a/appendices/ap01-programming.tex +++ b/appendices/ap01-programming.tex @@ -113,7 +113,7 @@ AutoDL & 按时计费 & 中期项目 \\ 所以整个链条是:\textbf{包管理器下载编译好的二进制 → 放到 PATH 目录 → shell 通过 PATH 找到它 → execve 加载到内存 →} -\textbf{二进制内部调用 OS API 完成实际工作}。没有任何''魔法'',本质上就是文件操作和进程管理的组合。 +\textbf{二进制内部调用 OS API 完成实际工作}。没有任何“魔法”,本质上就是文件操作和进程管理的组合。 \subsubsection{程序设计语言与软件开发} @@ -175,7 +175,7 @@ Ruby:Web开发(Ruby on Rails) 特点:开发灵活、调试方便,但运行速度通常慢于编译型语言。 -\textbf{混合模式}:Java 采用''编译为字节码 → 虚拟机解释执行''的混合方式,兼顾了跨平台和性能。 +\textbf{混合模式}:Java 采用“编译为字节码 → 虚拟机解释执行”的混合方式,兼顾了跨平台和性能。 \paragraph{常见编程语言概览} @@ -289,7 +289,7 @@ pip install torch torchvision \subparagraph{Python概述与特点}\label{pythonux6982ux8ff0ux4e0eux7279ux70b9} -Python由Guido van Rossum于1991年发布,以''优雅''\,``简洁''\,``可读性强''为设计哲学。它是当前AI和数据科学领域使用最广泛的编程语言。 +Python由Guido van Rossum于1991年发布,以“优雅”\,``简洁“\,``可读性强”为设计哲学。它是当前AI和数据科学领域使用最广泛的编程语言。 \textbf{核心特点}: - 语法简洁,接近自然语言,入门门槛低 - 丰富的第三方库生态(AI、数据处理、Web等) - 跨平台运行(Windows、macOS、Linux) - 活跃的开源社区支持 diff --git a/appendices/ap02-vibe-coding.tex b/appendices/ap02-vibe-coding.tex index 08f4777..1f2cb60 100644 --- a/appendices/ap02-vibe-coding.tex +++ b/appendices/ap02-vibe-coding.tex @@ -10,7 +10,7 @@ Vibe Coding:\textbf{模糊想法 → AI辅助 → 迭代完善} -Vibe Coding是一种以AI为核心的编程新模式:开发者用自然语言描述意图,AI生成代码,再通过迭代对话逐步完善。对于编程经验较少的设计专业读者而言,这种模式大幅降低了技术门槛------不需要记住语法细节,只需要清楚地表达''想要什么''。 +Vibe Coding是一种以AI为核心的编程新模式:开发者用自然语言描述意图,AI生成代码,再通过迭代对话逐步完善。对于编程经验较少的设计专业读者而言,这种模式大幅降低了技术门槛------不需要记住语法细节,只需要清楚地表达“想要什么”。 \paragraph{工作流程} @@ -138,7 +138,7 @@ Claude Code提供VSCode扩展,在编辑器中获得同样的AI辅助能力: 在编辑器中选中代码后,可以直接向Claude提问或请求修改 \end{enumerate} -\textbf{常用场景}: - 选中一段代码,请求''解释这段代码'' - 选中函数,请求''添加错误处理'' - 在Claude面板中输入''帮我写单元测试'' +\textbf{常用场景}: - 选中一段代码,请求“解释这段代码” - 选中函数,请求“添加错误处理” - 在Claude面板中输入“帮我写单元测试” \paragraph{典型项目工作流} @@ -361,7 +361,7 @@ c & d \textbf{核心特性}: - \textbf{本地存储}:所有笔记以Markdown文件保存在本地,数据完全自主 - \textbf{双向链接}:用 {[}{[}笔记名{]}{]} 在笔记之间建立链接,形成知识网络 - \textbf{图谱视图}:可视化笔记之间的关联关系 - \textbf{插件生态}:丰富的社区插件扩展功能(如日历、看板、模板等) - \textbf{实时预览}:编辑Markdown时实时渲染效果 -\textbf{使用建议}: - 用Obsidian打开本教材的根目录,即可获得完整的阅读与编辑体验 - 建议安装''目录''插件,方便在长文档中快速导航 - 利用双向链接功能,将学习笔记与教材内容关联起来 +\textbf{使用建议}: - 用Obsidian打开本教材的根目录,即可获得完整的阅读与编辑体验 - 建议安装“目录”插件,方便在长文档中快速导航 - 利用双向链接功能,将学习笔记与教材内容关联起来 \subsubsection{Git版本管理与GitHub协作}\label{gitux7248ux672cux7ba1ux7406ux4e0egithubux534fux4f5c} diff --git a/chapters/ch00-preface.tex b/chapters/ch00-preface.tex index 19f0d61..c4195eb 100644 --- a/chapters/ch00-preface.tex +++ b/chapters/ch00-preface.tex @@ -35,7 +35,7 @@ AI技术仍在飞速发展,本书的内容不可避免地会随着时间推移而需要更新。但书中所传达的核心思想——理解原理、拥抱工具、人机协作——将具有持久的价值。 -感谢AI技术本身——本书的写作过程中广泛使用了Claude、ChatGPT等AI工具进行资料整理、内容润色和代码验证,这本身就是"AI赋能工作"的一次实践。 +感谢AI技术本身——本书的写作过程中广泛使用了Claude Code等AI工具进行资料整理、内容润色和代码验证,这本身就是"AI赋能工作"的一次实践。 设计的人工智能时代才刚刚开始。希望这本书能成为读者进入这个新时代的一块踏脚石,从而汇聚起万千努力,能够成为点燃"通用设计智能"的星星之火。 diff --git a/chapters/ch01-intro.tex b/chapters/ch01-intro.tex index f3d0e78..27ef87e 100644 --- a/chapters/ch01-intro.tex +++ b/chapters/ch01-intro.tex @@ -47,7 +47,7 @@ \subsection{案例背景} -Amazon Go 是亚马逊推出的无人便利店,通过计算机视觉和传感器融合技术,实现''拿了就走''的购物体验。这一案例展示了多种 AI 技术如何协同工作,共同重构一个完整的线下场景。 +Amazon Go 是亚马逊推出的无人便利店,通过计算机视觉和传感器融合技术,实现“拿了就走”的购物体验。这一案例展示了多种 AI 技术如何协同工作,共同重构一个完整的线下场景。 \subsection{技术要素} @@ -70,7 +70,7 @@ Amazon Go 的 AI 技术栈融合了多项前沿技术: \subsection{启示} -Amazon Go 展示了 AI 技术如何重构传统场景。从''扫码支付''到''拿了就走'',AI 让交互变得更加自然。这个案例也说明,设计领域中许多看似复杂的环境感知与交互问题,都可以通过多技术的组合来加以解决。 +Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到“拿了就走”,AI 让交互变得更加自然。这个案例也说明,设计领域中许多看似复杂的环境感知与交互问题,都可以通过多技术的组合来加以解决。 \section{AI 发展时间线(2016--2024)} @@ -128,7 +128,7 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从''扫码支付''到'' 音频生成:音乐、配音、音效 \end{itemize} -\textbf{设计影响}:从''工具辅助''到''生成伙伴'' +\textbf{设计影响}:从“工具辅助”到“生成伙伴” \subsection{Agent(智能体)} @@ -148,7 +148,7 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从''扫码支付''到'' \textbf{工具(Tool Use)}:调用外部资源 \end{itemize} -\textbf{设计影响}:从''被动执行''到''主动协作'' +\textbf{设计影响}:从“被动执行”到“主动协作” \subsection{AI4S(AI for Science)}\label{ai4sai-for-science} @@ -497,9 +497,9 @@ y = a₁x₁ + a₂x₂ + b & 多输入神经元 \\ \def\labelenumi{\arabic{enumi}.} \tightlist \item - 万能逼近定理告诉我们神经网络''能''做任何事,但没有说''如何''高效学习。这个区别意味着什么? + 万能逼近定理告诉我们神经网络“能”做任何事,但没有说“如何”高效学习。这个区别意味着什么? \item - Scaling Law 是否意味着''越大越好''?在资源有限的情况下,应该如何权衡? + Scaling Law 是否意味着“越大越好”?在资源有限的情况下,应该如何权衡? \item 从函数式视角理解 AI,对你理解设计问题有何启发? \end{enumerate} diff --git a/chapters/ch02-framework.tex b/chapters/ch02-framework.tex index 13bc383..6d6116c 100644 --- a/chapters/ch02-framework.tex +++ b/chapters/ch02-framework.tex @@ -1,6 +1,6 @@ \chapter{设计人工智能的理论框架} -本章建立全书的核心理论框架。我们从''函数描述世界''的理念出发,引入数据模态(Data Modality)作为理解AI技术的组织原则,梳理从小模型到大模型的统一演进规律,并以多层感知机(MLP)作为一切深度学习的基础模型进行系统讲解。 +本章建立全书的核心理论框架。我们从“函数描述世界”的理念出发,引入数据模态(Data Modality)作为理解AI技术的组织原则,梳理从小模型到大模型的统一演进规律,并以多层感知机(MLP)作为一切深度学习的基础模型进行系统讲解。 \section{篇章导读} @@ -8,7 +8,7 @@ 无论是处理文本、图像还是三维空间数据,AI的本质工作都是一样的——从数据中学习映射函数 \(y = f(x; \theta)\)。区别仅在于输入数据的形态不同,因此需要不同的网络结构来高效处理。 -本章将: - 从函数式视角理解AI的本质 - 建立基于数据模态的全书知识地图 - 揭示所有AI技术背后的统一演进规律 - 深入讲解MLP这一最基础的神经网络 - 建立''环境-智能体-任务''实践框架,降低上手门槛 +本章将: - 从函数式视角理解AI的本质 - 建立基于数据模态的全书知识地图 - 揭示所有AI技术背后的统一演进规律 - 深入讲解MLP这一最基础的神经网络 - 建立“环境-智能体-任务”实践框架,降低上手门槛 \section{函数式AI视角} @@ -18,7 +18,7 @@ \begin{itemize} \tightlist \item - 理解''Functions Describe the World''的核心理念 + 理解“Functions Describe the World”的核心理念 \item 掌握从Excel线性回归到神经网络的演进逻辑 \item @@ -126,7 +126,7 @@ plt.grid(True, alpha=0.3) plt.show() \end{lstlisting} -这段代码展示了一个完整的''从数据中学习函数''的过程。虽然这只是最简单的线性回归,但它已经包含了AI的核心思想:\textbf{给定数据,自动确定函数参数}。 +这段代码展示了一个完整的“从数据中学习函数”的过程。虽然这只是最简单的线性回归,但它已经包含了AI的核心思想:\textbf{给定数据,自动确定函数参数}。 \subsection{数据驱动 vs 规则驱动} @@ -159,7 +159,7 @@ result = model.predict(new_image) # 自动判断 优势: - 自动发现人类难以表达的规律 - 数据越多,性能越好 - 可以处理复杂的、非线性的关系 - 适应性强,可迁移到新任务 \begin{quote} -\textbf{设计思维的转变}:从''设计规则''到''设计数据''。在AI时代,设计师不仅要设计规则(设计语言、规范),还要设计和管理训练数据,因为数据决定了AI学到的函数。 +\textbf{设计思维的转变}:从“设计规则”到“设计数据”。在AI时代,设计师不仅要设计规则(设计语言、规范),还要设计和管理训练数据,因为数据决定了AI学到的函数。 \end{quote} @@ -319,7 +319,7 @@ AI同样需要针对不同模态的数据采用不同的处理方式。一种数 \textbf{第四阶段:大模型时代(Foundation Models)} -参数规模达到十亿甚至万亿级别的模型,展现出''涌现能力''(Emergent Abilities)——模型规模大到一定程度后,突然具备了小模型没有的新能力。 +参数规模达到十亿甚至万亿级别的模型,展现出“涌现能力”(Emergent Abilities)——模型规模大到一定程度后,突然具备了小模型没有的新能力。 特点: - 单一模型处理多种任务(通用性) - 涌现能力:规模带来质变 - 少样本甚至零样本学习 - Scaling Law:性能随规模持续提升 @@ -412,7 +412,7 @@ FPFH → PointNet → Point-BERT → Point-E \item \textbf{预训练时代是设计师的最佳入口}。利用预训练模型,设计师不需要海量数据和强大算力,就能将AI应用到设计实践中。 \item - \textbf{大模型时代带来''民主化''}。大模型通过自然语言交互降低了AI的使用门槛,设计师可以用自然语言指挥AI完成设计任务。 + \textbf{大模型时代带来“民主化”}。大模型通过自然语言交互降低了AI的使用门槛,设计师可以用自然语言指挥AI完成设计任务。 \end{enumerate} @@ -589,7 +589,7 @@ print(f"最终输出: {y.flatten()}") \subsection{激活函数} -激活函数(Activation Function)是神经网络的''灵魂''。没有激活函数,无论网络有多少层,都等价于一个单层线性变换: +激活函数(Activation Function)是神经网络的“灵魂”。没有激活函数,无论网络有多少层,都等价于一个单层线性变换: \[y = W_2(W_1x) = (W_2W_1)x = W'x\] @@ -624,7 +624,7 @@ Sigmoid & \(\sigma(z) = \frac{1}{1+e^{-z}}\) & (0, 1) & 输出可解释为概率 ReLU & \(\text{ReLU}(z) = \max(0, z)\) & {[}0, +∞) & 计算简单高效;缓解梯度消失 & \textbf{隐藏层首选} \\ Tanh & \(\tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}\) & (-1, 1) & 零中心化;两端梯度消失 & 循环网络隐藏层 \\ Softmax & \(\text{softmax}(z_i) = \frac{e^{z_i}}{\sum_j e^{z_j}}\) & (0, 1),和为1 & 输出为概率分布 & 多分类输出层 \\ -LeakyReLU & \(\text{LeakyReLU}(z) = \max(\alpha z, z)\) & (-∞, +∞) & 解决ReLU''死神经元''问题 & 深层网络隐藏层 \\ +LeakyReLU & \(\text{LeakyReLU}(z) = \max(\alpha z, z)\) & (-∞, +∞) & 解决ReLU“死神经元”问题 & 深层网络隐藏层 \\ \end{longtable} } @@ -646,12 +646,12 @@ ReLU: Sigmoid: Tanh: \end{lstlisting} \begin{quote} -\textbf{设计类比}:激活函数就像是设计中的''非线性思维''。如果只有线性思维(没有激活函数),无论思考多少层,结论都是线性的——就像在一条直线上来回走。激活函数引入了''跳跃''和''拐弯''的能力,让网络能够表达复杂的设计关系。 +\textbf{设计类比}:激活函数就像是设计中的“非线性思维”。如果只有线性思维(没有激活函数),无论思考多少层,结论都是线性的——就像在一条直线上来回走。激活函数引入了“跳跃”和“拐弯”的能力,让网络能够表达复杂的设计关系。 \end{quote} \subsection{损失函数} -损失函数(Loss Function)衡量模型预测值与真实值之间的差距,是训练过程的''指南针''。 +损失函数(Loss Function)衡量模型预测值与真实值之间的差距,是训练过程的“指南针”。 \textbf{常用损失函数} @@ -695,7 +695,7 @@ ReLU: Sigmoid: Tanh: \subsection{反向传播与梯度下降} -反向传播(Backpropagation)是训练神经网络的核心算法,它解决了''如何高效计算每个参数对损失的影响程度''这一问题。 +反向传播(Backpropagation)是训练神经网络的核心算法,它解决了“如何高效计算每个参数对损失的影响程度”这一问题。 \textbf{核心思想:梯度下降} @@ -832,7 +832,7 @@ print(f"真实参数: W = [2.0, 3.0], b = [1.0]") \begin{itemize} \tightlist \item - 理解''环境-智能体-任务''三元框架 + 理解“环境-智能体-任务”三元框架 \item 认识环境配置是AI实践中的关键瓶颈 \item @@ -927,7 +927,7 @@ GPU/CUDA配置 & 驱动版本与CUDA版本不匹配 & ★★★★★ \\ } \begin{quote} -\textbf{核心观点}:环境问题不是''技术能力不足''的问题,而是\textbf{基础设施鸿沟}。正如设计师不需要理解CAD软件的底层渲染引擎才能画图,学习AI也不应该被环境配置阻挡在门外。 +\textbf{核心观点}:环境问题不是“技术能力不足”的问题,而是\textbf{基础设施鸿沟}。正如设计师不需要理解CAD软件的底层渲染引擎才能画图,学习AI也不应该被环境配置阻挡在门外。 \end{quote} \subsection{降低门槛的实践策略} @@ -1049,7 +1049,7 @@ d2l.ai(动手学深度学习) & 代码驱动,PyTorch/MXNet/TensorFlow多 \endhead \bottomrule\noalign{} \endlastfoot -Hugging Face & 模型和数据集的''GitHub'',可在线体验 \\ +Hugging Face & 模型和数据集的“GitHub”,可在线体验 \\ Civitai & Stable Diffusion模型分享社区 \\ Papers With Code & 论文+代码+排行榜,追踪最新技术 \\ \end{longtable} diff --git a/chapters/ch03-1d-sequence.tex b/chapters/ch03-1d-sequence.tex index 4241113..7b5c793 100644 --- a/chapters/ch03-1d-sequence.tex +++ b/chapters/ch03-1d-sequence.tex @@ -4,7 +4,7 @@ 一维数据(1D Data)是人工智能处理的最基础、也是最重要的数据形态。你正在阅读的文字、你说出的一句话、股票市场的价格走势、建筑室内温度随时间的变化——这些都是一维序列数据。 -与图像(二维)和三维模型(三维)不同,一维数据的核心特征是\textbf{有序性}:每一个元素的含义不仅取决于它本身,还取决于它在序列中的位置以及与前后元素的关系。``我吃饭了''和''饭我吃了''虽然包含相同的字,但含义截然不同——这就是序列的魅力与挑战。 +与图像(二维)和三维模型(三维)不同,一维数据的核心特征是\textbf{有序性}:每一个元素的含义不仅取决于它本身,还取决于它在序列中的位置以及与前后元素的关系。``我吃饭了“和”饭我吃了''虽然包含相同的字,但含义截然不同——这就是序列的魅力与挑战。 本章将带你踏上一段激动人心的技术演进之旅:从早期的小型循环神经网络(RNN),到注意力机制的革命性突破,再到 Transformer 架构的横空出世,最终见证大语言模型(LLM)如何改变整个 AI 格局。这条从小模型到大模型的技术脉络,不仅是深度学习最精彩的故事之一,也直接关系到今天每一位设计师如何使用 AI 工具。 @@ -75,14 +75,14 @@ "光线 充足" → 设计优点 \end{lstlisting} -模型需要''记住''之前看到的内容,才能理解当前内容。这正是\textbf{循环神经网络}要解决的核心问题。 +模型需要“记住”之前看到的内容,才能理解当前内容。这正是\textbf{循环神经网络}要解决的核心问题。 \section{RNN:循环神经网络} \subsection{核心思想} -RNN(Recurrent Neural Network)通过\textbf{隐藏状态}(Hidden State)在时间步之间传递信息,实现''记忆''功能。 +RNN(Recurrent Neural Network)通过\textbf{隐藏状态}(Hidden State)在时间步之间传递信息,实现“记忆”功能。 \begin{lstlisting} 时间展开视图: @@ -128,7 +128,7 @@ RNN(Recurrent Neural Network)通过\textbf{隐藏状态}(Hidden State) 时间步7:看到"空间感" → h₇ = "完整理解:客厅用开放式布局来增加空间感" \end{lstlisting} -每一步,RNN 都在累积和更新对文本的理解。这就是''记忆''的力量。 +每一步,RNN 都在累积和更新对文本的理解。这就是“记忆”的力量。 \subsection{PyTorch 代码示例} @@ -189,14 +189,14 @@ RNN 需要通过反向传播跨越多个时间步来更新参数。当序列较 RNN 处理长序列时遇到同样的问题! \end{lstlisting} -在实际应用中,标准 RNN 通常只能''记住''5-10步之前的信息。对于''这个设计方案虽然外观简洁大方,功能分区合理,但是整体造价偏高''这样跨越多个分句的评价,RNN 可能会遗忘前半部分的内容。 +在实际应用中,标准 RNN 通常只能“记住”5-10步之前的信息。对于“这个设计方案虽然外观简洁大方,功能分区合理,但是整体造价偏高”这样跨越多个分句的评价,RNN 可能会遗忘前半部分的内容。 \section{LSTM:长短期记忆网络} \subsection{设计哲学} -LSTM(Long Short-Term Memory)由 Hochreiter 和 Schmidhuber 于1997年提出,核心创新是引入\textbf{细胞状态}(Cell State)——一条贯穿整个序列的''信息高速公路'',让信息可以长距离传递而不被稀释。 +LSTM(Long Short-Term Memory)由 Hochreiter 和 Schmidhuber 于1997年提出,核心创新是引入\textbf{细胞状态}(Cell State)——一条贯穿整个序列的“信息高速公路”,让信息可以长距离传递而不被稀释。 \begin{lstlisting} LSTM 单元内部结构: @@ -220,7 +220,7 @@ LSTM 单元内部结构: \subsection{三道门:遗忘、输入、输出} -LSTM 通过三个''门''(Gate)来精确控制信息的流动: +LSTM 通过三个“门”(Gate)来精确控制信息的流动: \textbf{1. 遗忘门(Forget Gate)}:决定从细胞状态中丢弃什么信息 @@ -428,7 +428,7 @@ RNN 的局限 & 具体影响 \\ \subsection{核心思想} -自注意力让序列中的每个位置都能\textbf{直接}与所有其他位置''交流'',一步到位地获取全局信息。 +自注意力让序列中的每个位置都能\textbf{直接}与所有其他位置“交流”,一步到位地获取全局信息。 \begin{lstlisting} 传统 RNN(串行传递信息): @@ -553,7 +553,7 @@ print(f"输出形状: {output.shape}") # (1, 4, 64) \subsection{为什么需要多头?} -单个注意力头只能学习一种''关注模式''。现实中的语言理解需要同时关注多种关系: +单个注意力头只能学习一种“关注模式”。现实中的语言理解需要同时关注多种关系: \begin{lstlisting} 句子:"设计师用木质材料打造了温馨的北欧风格客厅" @@ -619,7 +619,7 @@ class MultiHeadAttention(nn.Module): \subsection{为什么需要位置信息?} -Self-Attention 本身是''位置无关''的——它把输入看作一个集合(Set),而不是序列(Sequence): +Self-Attention 本身是“位置无关”的——它把输入看作一个集合(Set),而不是序列(Sequence): \begin{lstlisting} 输入 A:"客厅 在 北面" @@ -833,9 +833,9 @@ class FeedForward(nn.Module): 输出 → 传递给下一层或最终线性层 \end{lstlisting} -\subsection{Masked Self-Attention:为什么要''掩码''?} +\subsection{Masked Self-Attention:为什么要“掩码”?} -在生成文本时,模型不能''偷看''未来的词: +在生成文本时,模型不能“偷看”未来的词: \begin{lstlisting} 生成 "现代 简约 风格 客厅": @@ -1191,7 +1191,7 @@ Transformer 论文发表后的几年里,研究者们发现了一个关键规 \section{RAG:检索增强生成} -\subsection{问题:大模型的''幻觉''} +\subsection{问题:大模型的“幻觉”} LLM 会自信地编造不存在的事实: @@ -1338,7 +1338,7 @@ answer = llm.generate(augmented_prompt) \subsection{核心原则} -Prompt Engineering 是与大语言模型有效沟通的''艺术与科学'': +Prompt Engineering 是与大语言模型有效沟通的“艺术与科学”: \begin{lstlisting} 原则一:明确任务 diff --git a/chapters/ch04-2d-vision.tex b/chapters/ch04-2d-vision.tex index 592496a..44d8a63 100644 --- a/chapters/ch04-2d-vision.tex +++ b/chapters/ch04-2d-vision.tex @@ -6,7 +6,7 @@ 人类感知世界,约80\%的信息来自视觉。对于设计师而言,图像不仅是设计成果的呈现形式,更是灵感来源、分析对象和沟通媒介。 -本章将沿着一条清晰的技术演进主线展开:\textbf{从小模型时代(CNN)到大模型时代(Vision Transformer),再到多模态大视觉模型}。我们将看到,计算机视觉如何从''识别图片中的猫''一步步发展到''理解任意场景中的任意内容'',以及这些技术如何赋能建筑识别、街景分析、设计素材管理等设计实践。 +本章将沿着一条清晰的技术演进主线展开:\textbf{从小模型时代(CNN)到大模型时代(Vision Transformer),再到多模态大视觉模型}。我们将看到,计算机视觉如何从“识别图片中的猫”一步步发展到“理解任意场景中的任意内容”,以及这些技术如何赋能建筑识别、街景分析、设计素材管理等设计实践。 通过本章学习,你将: @@ -75,7 +75,7 @@ CNN通过三个关键设计解决了MLP的上述缺陷: \end{longtable} } -\textbf{直觉理解}:人在识别一张建筑照片时,不会同时关注所有像素,而是先看局部特征(窗户、门、柱子),再组合成整体判断。CNN正是模拟了这种''从局部到整体''的视觉处理方式。 +\textbf{直觉理解}:人在识别一张建筑照片时,不会同时关注所有像素,而是先看局部特征(窗户、门、柱子),再组合成整体判断。CNN正是模拟了这种“从局部到整体”的视觉处理方式。 \subsection{卷积操作} @@ -242,7 +242,7 @@ LeNet (1998) AlexNet (2012) VGG (2014) ResNet (2015) \endlastfoot LeNet-5 & 1998 & 5层 & 首个成功的CNN & 手写数字识别,邮局实用 \\ AlexNet & 2012 & 8层 & ReLU、Dropout、GPU训练 & ImageNet竞赛冠军,深度学习复兴 \\ -VGGNet & 2014 & 16-19层 & 3×3小卷积核堆叠 & 证明''更深=更好''的简洁设计 \\ +VGGNet & 2014 & 16-19层 & 3×3小卷积核堆叠 & 证明“更深=更好”的简洁设计 \\ ResNet & 2015 & 152层+ & 残差连接(Skip Connection) & 突破深度瓶颈,可训练极深网络 \\ \end{longtable} } @@ -293,7 +293,7 @@ ResNet的核心创新是\textbf{残差连接(Residual Connection)}: \end{itemize} \begin{quote} -\textbf{设计思维链接}:残差连接的思想类似于设计中的''增量修改''——在保留原有方案(x)的基础上进行改进(F(x)),而非推倒重来。这种''在已有基础上做调整''的策略,在参数空间中比''从零开始学习''高效得多。 +\textbf{设计思维链接}:残差连接的思想类似于设计中的“增量修改”——在保留原有方案(x)的基础上进行改进(F(x)),而非推倒重来。这种“在已有基础上做调整”的策略,在参数空间中比“从零开始学习”高效得多。 \end{quote} @@ -301,7 +301,7 @@ ResNet的核心创新是\textbf{残差连接(Residual Connection)}: \subsection{从分类到检测} -图像分类回答的问题是''这是什么'',而目标检测需要同时回答两个问题: +图像分类回答的问题是“这是什么”,而目标检测需要同时回答两个问题: \begin{lstlisting} 分类: "这是一张建筑的照片" → what @@ -332,7 +332,7 @@ ResNet的核心创新是\textbf{残差连接(Residual Connection)}: \subsection{两阶段检测器} -两阶段方法的思路是''先找候选区域,再分类判别'',精度高但速度较慢。 +两阶段方法的思路是“先找候选区域,再分类判别”,精度高但速度较慢。 \textbf{演进路线}: @@ -586,7 +586,7 @@ DeepLab由Google团队提出,其核心创新是\textbf{空洞卷积(Atrous C 2020年,Google团队提出了 \textbf{ViT(Vision Transformer)},首次证明纯Transformer架构可以在图像任务上达到甚至超越CNN的性能,开启了视觉领域的Transformer时代。 -\textbf{ViT的核心思路}:将图像切割为固定大小的图块(Patch),将每个图块视为一个''词''(Token),然后送入标准Transformer编码器处理。 +\textbf{ViT的核心思路}:将图像切割为固定大小的图块(Patch),将每个图块视为一个“词”(Token),然后送入标准Transformer编码器处理。 \begin{lstlisting} 输入图像 (224×224×3) 切分为图块 线性嵌入 @@ -744,7 +744,7 @@ Swin Transformer的设计使其兼具CNN的层级特征提取优势和Transforme └─────────┘ └──────────┘ \end{lstlisting} -CLIP的训练目标:对于N个''图像-文本''配对,最大化正确配对的相似度,最小化错误配对的相似度。 +CLIP的训练目标:对于N个“图像-文本”配对,最大化正确配对的相似度,最小化错误配对的相似度。 \textbf{零样本分类}: @@ -764,7 +764,7 @@ CLIP的意义在于:\textbf{用自然语言定义视觉概念},打破了传 \subsection{SAM:分割一切} -\textbf{SAM(Segment Anything Model, Meta, 2023)}是一个''可提示''的通用分割模型,能够根据各种提示(点、框、文本)分割图像中的任意目标。 +\textbf{SAM(Segment Anything Model, Meta, 2023)}是一个“可提示”的通用分割模型,能够根据各种提示(点、框、文本)分割图像中的任意目标。 \begin{lstlisting} SAM 的三种提示方式 @@ -796,7 +796,7 @@ SAM 的三种提示方式 \textbf{海量数据集}:SA-1B数据集包含10亿级自动标注的分割掩码 \end{itemize} -SAM的设计理念是成为视觉领域的''基础模型''——像大语言模型处理文本一样,成为处理视觉分割任务的基础设施。 +SAM的设计理念是成为视觉领域的“基础模型”——像大语言模型处理文本一样,成为处理视觉分割任务的基础设施。 \subsection{DINOv2:自监督视觉特征} @@ -834,7 +834,7 @@ DINOv2学到的特征具有惊人的语义对齐能力——无需文本训练 \subsection{视觉-语言模型} -大视觉模型发展的一个重要趋势是\textbf{视觉与语言模态的融合}。模型不再仅''看图说话'',而是真正理解图像内容并可以回答关于图像的复杂问题。 +大视觉模型发展的一个重要趋势是\textbf{视觉与语言模态的融合}。模型不再仅“看图说话”,而是真正理解图像内容并可以回答关于图像的复杂问题。 \textbf{典型任务与模型}: @@ -949,7 +949,7 @@ DINOv2学到的特征具有惊人的语义对齐能力——无需文本训练 \item \textbf{智能标签}:自动为设计素材添加语义标签,无需人工标注 \item - \textbf{自然语言检索}:用文字描述查找设计参考图(如''带玻璃幕墙的现代商业建筑'') + \textbf{自然语言检索}:用文字描述查找设计参考图(如“带玻璃幕墙的现代商业建筑”) \item \textbf{风格分类}:自动识别设计作品的风格特征 \item @@ -971,7 +971,7 @@ DINOv2学到的特征具有惊人的语义对齐能力——无需文本训练 后现代/...) 未知风格) 的设计案例) \end{lstlisting} -结合CLIP的零样本能力,设计师可以自定义风格类别(如''新中式''\,``极简主义''``有机建筑''等),无需收集训练数据即可进行风格分类。 +结合CLIP的零样本能力,设计师可以自定义风格类别(如“新中式”\,``极简主义“``有机建筑”等),无需收集训练数据即可进行风格分类。 \section{本章小结} @@ -1004,9 +1004,9 @@ CNN时代 (2012-2020) Transformer时代 (2020-) \item \textbf{架构对比}:CNN通过局部卷积提取特征,ViT通过全局自注意力建立关系。在设计场景中(如建筑立面分析、街景品质评估),你认为哪种架构更适合?为什么? \item - \textbf{零样本能力}:CLIP实现了''用自然语言做图像分类''的零样本能力。如果你是一名城市设计师,想用CLIP分析城市街景的''宜居性'',你会如何设计提示文本?考虑需要哪些视觉线索。 + \textbf{零样本能力}:CLIP实现了“用自然语言做图像分类”的零样本能力。如果你是一名城市设计师,想用CLIP分析城市街景的“宜居性”,你会如何设计提示文本?考虑需要哪些视觉线索。 \item - \textbf{大模型与传统方法}:SAM号称可以''分割一切''。在专业设计领域(如建筑精细构件识别、景观植物种类分割),通用大模型和针对特定任务训练的小模型各有什么优势和局限?你会如何选择? + \textbf{大模型与传统方法}:SAM号称可以“分割一切”。在专业设计领域(如建筑精细构件识别、景观植物种类分割),通用大模型和针对特定任务训练的小模型各有什么优势和局限?你会如何选择? \end{enumerate} @@ -1032,7 +1032,7 @@ CNN时代 (2012-2020) Transformer时代 (2020-) 卷积神经网络 & Convolutional Neural Network (CNN) & 利用卷积操作提取局部特征的神经网络 \\ 卷积核/滤波器 & Kernel / Filter & 卷积操作中用于特征提取的小矩阵 \\ 池化 & Pooling & 降低特征图空间尺寸的下采样操作 \\ -感受野 & Receptive Field & 神经元能''看到''的输入区域大小 \\ +感受野 & Receptive Field & 神经元能“看到”的输入区域大小 \\ 残差连接 & Residual/Skip Connection & 将输入直接加到输出上,解决深层网络退化问题 \\ 目标检测 & Object Detection & 同时识别图像中目标的类别和位置 \\ 边界框 & Bounding Box & 用矩形框标出目标位置的表示方法 \\ diff --git a/chapters/ch05-3d-spatial.tex b/chapters/ch05-3d-spatial.tex index 8e7c4f1..9f7c39e 100644 --- a/chapters/ch05-3d-spatial.tex +++ b/chapters/ch05-3d-spatial.tex @@ -2,9 +2,9 @@ \section{篇章导读} -三维数据是AI与物理世界之间最直接的桥梁。从建筑到城市规划,从景观到工业设计,空间理解始终是设计实践的核心能力。一架无人机飞过城市上空,激光雷达 (LiDAR) 每秒发射数十万束激光,返回的每一个点都在描述一个真实的空间坐标——这些点汇聚成点云,构成数字世界的三维基础。一个设计师用手机扫描房间,几秒钟后便得到完整的三维模型;一位规划师输入''现代化办公椅''的文本描述,AI便能生成一个可编辑的3D模型。 +三维数据是AI与物理世界之间最直接的桥梁。从建筑到城市规划,从景观到工业设计,空间理解始终是设计实践的核心能力。一架无人机飞过城市上空,激光雷达 (LiDAR) 每秒发射数十万束激光,返回的每一个点都在描述一个真实的空间坐标——这些点汇聚成点云,构成数字世界的三维基础。一个设计师用手机扫描房间,几秒钟后便得到完整的三维模型;一位规划师输入“现代化办公椅”的文本描述,AI便能生成一个可编辑的3D模型。 -这些场景不再是科幻。从传统的多视图立体匹配 (MVS) 到神经辐射场 (NeRF),从三维高斯溅射 (3D Gaussian Splatting) 到大规模空间智能模型,三维AI正在经历从小模型到大模型、从感知到推理的范式跃迁。本章将带你走进三维数据的世界,理解AI如何''看见''和''重建''空间,并探索空间智能在设计领域的广阔应用。 +这些场景不再是科幻。从传统的多视图立体匹配 (MVS) 到神经辐射场 (NeRF),从三维高斯溅射 (3D Gaussian Splatting) 到大规模空间智能模型,三维AI正在经历从小模型到大模型、从感知到推理的范式跃迁。本章将带你走进三维数据的世界,理解AI如何“看见”和“重建”空间,并探索空间智能在设计领域的广阔应用。 \section{三维数据表示} @@ -131,7 +131,7 @@ \item 内存消耗与分辨率的立方成正比 \item - 分辨率有限时存在''方块效应'' + 分辨率有限时存在“方块效应” \item 适合3D卷积神经网络处理 \end{itemize} @@ -703,7 +703,7 @@ MVS稠密匹配 \subsubsection{核心思想} -不再显式存储3D模型(点云/网格),而是用一个神经网络来''记住''整个三维场景: +不再显式存储3D模型(点云/网格),而是用一个神经网络来“记住”整个三维场景: \begin{lstlisting} 传统: 场景 → 存储为点云/网格/体素 @@ -859,7 +859,7 @@ NeRF的隐式表示虽然质量高,但速度慢、难以编辑。3D Gaussian S \subsection{3D生成模型} -从2023年开始,AI不仅能''重建''已有场景,还能从零''生成''新的3D内容。 +从2023年开始,AI不仅能“重建”已有场景,还能从零“生成”新的3D内容。 \subsubsection{Text-to-3D (文本生成3D)} @@ -1070,7 +1070,7 @@ print(f"颜色形状: {color.shape}, 密度形状: {density.shape}") \subsection{从3D感知到空间推理} -前两节我们学习了AI如何''感知''和''重建''三维世界。空间智能 (Spatial Intelligence) 则更进一步——不仅要感知空间,还要理解和推理空间中的关系、规律与语义。 +前两节我们学习了AI如何“感知”和“重建”三维世界。空间智能 (Spatial Intelligence) 则更进一步——不仅要感知空间,还要理解和推理空间中的关系、规律与语义。 \begin{lstlisting} 3D能力层次: @@ -1308,7 +1308,7 @@ AI增强GIS: \item 数字孪生的四个层次在设计实践中分别对应哪些具体工具和方法? \item - 设想一个''认知孪生''校园,它能做哪些事情?需要哪些技术支撑? + 设想一个“认知孪生”校园,它能做哪些事情?需要哪些技术支撑? \end{enumerate} \subsection{关键术语} @@ -1682,7 +1682,7 @@ print("城市模型已保存为 city_model.obj") \item \textbf{技术路线对比}:NeRF和3D Gaussian Splatting分别代表了隐式和显式的场景表示路线。请从设计应用的角度分析:哪些设计场景更适合NeRF,哪些更适合3DGS?未来两者会融合还是分化? \item - \textbf{空间智能畅想}:设想你正在设计一个''AI空间设计师助手'',它能理解建筑平面图、3D模型和自然语言描述。请描述这个系统的核心功能模块,以及每个模块需要用到本章学到的哪些技术。 + \textbf{空间智能畅想}:设想你正在设计一个“AI空间设计师助手”,它能理解建筑平面图、3D模型和自然语言描述。请描述这个系统的核心功能模块,以及每个模块需要用到本章学到的哪些技术。 \end{enumerate} \section{关键术语} diff --git a/chapters/ch06-generative.tex b/chapters/ch06-generative.tex index fc214a7..6f85b29 100644 --- a/chapters/ch06-generative.tex +++ b/chapters/ch06-generative.tex @@ -2,7 +2,7 @@ \section{篇章导读} -生成式AI(Generative AI)正在重新定义创造的边界。从图像生成到音乐创作,从文本写作到代码生成,AI不再仅仅是分析和识别的工具,而是成为人类的''创意伙伴''(Creative Partner)。设计师可以用文字描述一个想法,AI便能将其转化为可视化的图像;建筑师可以勾勒一个草图,AI便能渲染出逼真的效果图。这种从''分析''到''创造''的转变,正是生成式AI最激动人心的地方。 +生成式AI(Generative AI)正在重新定义创造的边界。从图像生成到音乐创作,从文本写作到代码生成,AI不再仅仅是分析和识别的工具,而是成为人类的“创意伙伴”(Creative Partner)。设计师可以用文字描述一个想法,AI便能将其转化为可视化的图像;建筑师可以勾勒一个草图,AI便能渲染出逼真的效果图。这种从“分析”到“创造”的转变,正是生成式AI最激动人心的地方。 本章将从生成模型的基本原理出发,系统介绍从自编码器(AE)、对抗生成网络(GAN)到扩散模型(Diffusion Model)的技术演进,并深入探讨AIGC工具链在设计领域的实际应用。 @@ -19,7 +19,7 @@ 输入 → 编码器 (Encoder) → 潜在表示 (Latent) → 解码器 (Decoder) → 重构输出 \end{lstlisting} -自编码器的工作方式可以理解为''先压缩,再还原'':编码器将输入数据压缩到一个低维的潜在空间(Latent Space),解码器再从潜在表示中还原出原始数据。通过训练使还原输出尽可能接近原始输入,模型便学会了数据的关键特征。 +自编码器的工作方式可以理解为“先压缩,再还原”:编码器将输入数据压缩到一个低维的潜在空间(Latent Space),解码器再从潜在表示中还原出原始数据。通过训练使还原输出尽可能接近原始输入,模型便学会了数据的关键特征。 \textbf{局限性:} @@ -76,7 +76,7 @@ VAE的关键在于将潜在空间约束为\textbf{标准正态分布}。这意 } \begin{quote} -\textbf{设计类比}:VAE就像一位理解了''风格空间''的画师——他不仅会临摹,还能在''风格空间''中探索,画出从未见过但风格一致的新作品。 +\textbf{设计类比}:VAE就像一位理解了“风格空间”的画师——他不仅会临摹,还能在“风格空间”中探索,画出从未见过但风格一致的新作品。 \end{quote} @@ -104,7 +104,7 @@ GAN的训练过程可以类比为\textbf{伪造者与鉴定师}的博弈: \item \textbf{鉴定师}(判别器)不断提升辨别能力,区分真画和假画 \item - 随着对抗的持续,伪造者的技术越来越高超,最终能制造出连鉴定师都无法分辨的''杰作'' + 随着对抗的持续,伪造者的技术越来越高超,最终能制造出连鉴定师都无法分辨的“杰作” \end{itemize} \textbf{训练过程:} @@ -174,7 +174,7 @@ CycleGAN解决了一个重要的实际问题:\textbf{无需成对训练数据} CycleGAN的设计应用十分广泛:实景照片转水彩风格、白天场景转夜晚、夏季景观转冬季等。 \begin{quote} -\textbf{设计思考}:GAN系列模型展示了''对抗''这一全新的训练范式——不是告诉模型''正确答案是什么'',而是让两个模型在竞争中共同进化。这种思想在设计领域同样适用:方案生成与方案评审的对抗,可以推动设计质量的提升。 +\textbf{设计思考}:GAN系列模型展示了“对抗”这一全新的训练范式——不是告诉模型“正确答案是什么”,而是让两个模型在竞争中共同进化。这种思想在设计领域同样适用:方案生成与方案评审的对抗,可以推动设计质量的提升。 \end{quote} @@ -220,7 +220,7 @@ x₀ ≈ 原始图像 损失函数:L = ||ε - ε_θ(x_t, t)||² \end{lstlisting} -模型不需要学习''好图像长什么样'',而是学习''噪声长什么样''——这是一个更容易学习的目标。 +模型不需要学习“好图像长什么样”,而是学习“噪声长什么样”——这是一个更容易学习的目标。 \subsection{Stable Diffusion架构} @@ -311,15 +311,15 @@ CLIP & 文图对齐 & 确保生成的图像与文本描述语义一致 \\ \item \textbf{主体描述}:画面核心内容 \item - \textbf{风格指定}:如''水彩画''\,``赛博朋克''``极简主义'' + \textbf{风格指定}:如“水彩画”\,``赛博朋克“``极简主义” \item - \textbf{质量修饰}:如''高清''\,``细节丰富''``4K'' + \textbf{质量修饰}:如“高清”\,``细节丰富“``4K” \item - \textbf{光照氛围}:如''黄金时段光线''\,``柔和阴影'' + \textbf{光照氛围}:如“黄金时段光线”\,``柔和阴影'' \end{itemize} \begin{quote} -\textbf{设计类比}:文生图过程就像一位设计师根据客户的文字需求进行创作。提示词是''设计任务书'',CLIP编码器理解需求,U-Net是''设计师的大脑'',而VAE解码器将脑海中的概念转化为可见的图纸。 +\textbf{设计类比}:文生图过程就像一位设计师根据客户的文字需求进行创作。提示词是“设计任务书”,CLIP编码器理解需求,U-Net是“设计师的大脑”,而VAE解码器将脑海中的概念转化为可见的图纸。 \end{quote} @@ -404,7 +404,7 @@ Canny边缘 & Canny Edge & 检测图像轮廓 & 草图控制、线稿渲染 \\ 基础模型 + LoRA_A + LoRA_B = 混合风格生成 \end{lstlisting} -设计师可以针对特定设计风格训练专属LoRA,如''新中式风格''\,``日式极简风格''等,实现个性化的AI生成。 +设计师可以针对特定设计风格训练专属LoRA,如“新中式风格”\,``日式极简风格''等,实现个性化的AI生成。 \subsection{ComfyUI:模块化工作流} diff --git a/chapters/ch07-agent.tex b/chapters/ch07-agent.tex index 7bb2a03..57924aa 100644 --- a/chapters/ch07-agent.tex +++ b/chapters/ch07-agent.tex @@ -2,9 +2,9 @@ \section{篇章导读} -AI Agent(智能体)代表了人工智能的下一个前沿:从''被动响应''到''主动行动'',从''单一能力''到''系统协同''。如果说前几章介绍的AI模型是''工具'',那么AI Agent就是能\textbf{自主使用工具的助手}。 +AI Agent(智能体)代表了人工智能的下一个前沿:从“被动响应”到“主动行动”,从“单一能力”到“系统协同”。如果说前几章介绍的AI模型是“工具”,那么AI Agent就是能\textbf{自主使用工具的助手}。 -想象这样一幅场景:你告诉AI''帮我分析这块场地的开发潜力'',它不再只是被动地等待你一步步指令,而是主动调用地图工具获取地块信息、查询规划数据库核对用地性质、分析日照和交通数据、最终生成一份完整的场地分析报告。这就是AI Agent——一个能感知环境、制定计划、调用工具并持续改进的智能系统。 +想象这样一幅场景:你告诉AI“帮我分析这块场地的开发潜力”,它不再只是被动地等待你一步步指令,而是主动调用地图工具获取地块信息、查询规划数据库核对用地性质、分析日照和交通数据、最终生成一份完整的场地分析报告。这就是AI Agent——一个能感知环境、制定计划、调用工具并持续改进的智能系统。 本章将从规则系统出发,系统介绍LLM-based Agent的架构、推理模式、多Agent协作机制,以及在设计领域的应用前景。 @@ -13,7 +13,7 @@ AI Agent(智能体)代表了人工智能的下一个前沿:从''被动响 \subsection{规则系统时代} -最早的''智能系统''基于\textbf{规则(Rules)},即''如果满足条件A,则执行动作B''。 +最早的“智能系统”基于\textbf{规则(Rules)},即“如果满足条件A,则执行动作B”。 \textbf{典型结构:} @@ -39,7 +39,7 @@ else: \item 维护困难——规则数量膨胀后,系统变得难以理解和更新 \item - 缺乏理解——系统并不''理解''规则背后的含义,只是机械执行 + 缺乏理解——系统并不“理解”规则背后的含义,只是机械执行 \end{itemize} \subsection{传统规划方法} @@ -72,7 +72,7 @@ else: \end{longtable} } -LLM之所以能成为Agent的''大脑'',关键在于它具备了: +LLM之所以能成为Agent的“大脑”,关键在于它具备了: \begin{itemize} \tightlist @@ -123,7 +123,7 @@ LLM之所以能成为Agent的''大脑'',关键在于它具备了: - 工具反馈:查询结果、执行状态、错误信息 \end{lstlisting} -感知的关键在于\textbf{理解意图}——用户说''设计一个公园'',Agent需要理解这涉及场地分析、功能分区、路径规划、植物配置等多个子任务。 +感知的关键在于\textbf{理解意图}——用户说“设计一个公园”,Agent需要理解这涉及场地分析、功能分区、路径规划、植物配置等多个子任务。 \subsection{规划(Planning)} @@ -236,7 +236,7 @@ CoT的价值在于\textbf{让思考过程可见},这不仅提升了推理的 \subsection{ReAct(Reasoning + Acting)}\label{reactreasoning-acting} -ReAct模式将\textbf{推理与行动交替进行},形成''思考-行动-观察''的循环。 +ReAct模式将\textbf{推理与行动交替进行},形成“思考-行动-观察”的循环。 \textbf{基本循环:} @@ -392,7 +392,7 @@ Agent角色 \item \textbf{Agent团队}:多个Agent组成固定团队,各有专长 \item - \textbf{Agent市场}:Agent可以''雇佣''其他Agent完成特定子任务 + \textbf{Agent市场}:Agent可以“雇佣”其他Agent完成特定子任务 \item \textbf{Agent社会}:大量Agent在开放环境中自主交互和协作 \end{itemize} @@ -627,11 +627,11 @@ AI协作能力: \item \textbf{推理模式}:CoT和ReAct各适用于什么场景?请分别举一个设计领域的应用案例。 \item - \textbf{多Agent设计}:如果要设计一个''城市规划审批Agent系统'',你会设计哪些Agent角色?它们之间如何协作? + \textbf{多Agent设计}:如果要设计一个“城市规划审批Agent系统”,你会设计哪些Agent角色?它们之间如何协作? \item \textbf{HITL实践}:在设计流程中,哪些环节应该由AI自动完成,哪些环节必须保留人工审核?请给出你的判断依据。 \item - \textbf{MCP理解}:MCP协议如何解决设计领域AI应用的''数据孤岛''问题?以一个具体的建筑设计场景为例进行说明。 + \textbf{MCP理解}:MCP协议如何解决设计领域AI应用的“数据孤岛”问题?以一个具体的建筑设计场景为例进行说明。 \item \textbf{未来展望}:你认为AI Agent在未来10年会如何改变设计行业的就业结构?设计师应该如何准备? \end{enumerate} diff --git a/chapters/ch08-rl.tex b/chapters/ch08-rl.tex index c625d43..4101995 100644 --- a/chapters/ch08-rl.tex +++ b/chapters/ch08-rl.tex @@ -6,7 +6,7 @@ 2016年,AlphaGo击败围棋世界冠军李世石,让强化学习走入公众视野。此后,从蛋白质结构预测(AlphaFold)到大语言模型的人类对齐(RLHF),强化学习已深入AI的各个核心领域,成为现代人工智能不可或缺的基石。 -本章将系统介绍强化学习的基础原理、核心算法、里程碑突破,以及它在大模型对齐和设计领域的应用。我们将看到,强化学习不仅是一种算法工具,更是理解''智能体如何在复杂世界中做出决策''的关键框架。 +本章将系统介绍强化学习的基础原理、核心算法、里程碑突破,以及它在大模型对齐和设计领域的应用。我们将看到,强化学习不仅是一种算法工具,更是理解“智能体如何在复杂世界中做出决策”的关键框架。 \section{学习目标} @@ -103,7 +103,7 @@ R & 奖励函数(Reward Function) & R(s,a),在状态s采取动作a获得 \[G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + ... = \sum_{k=0}^{\infty} \gamma^k r_{t+k}\] -为了评估''处于某个状态有多好'',我们定义两种价值函数: +为了评估“处于某个状态有多好”,我们定义两种价值函数: \textbf{状态价值函数(State Value Function)V(s)}:在状态s下,遵循策略π所能获得的期望累积奖励。 @@ -113,7 +113,7 @@ R & 奖励函数(Reward Function) & R(s,a),在状态s采取动作a获得 \[Q^\pi(s, a) = \mathbb{E}_\pi [G_t | S_t = s, A_t = a]\] -两者的关系是:V(s) 是对所有可能动作的Q值的加权平均。Q函数更为实用,因为它直接告诉我们在某个状态下''哪个动作最好''。 +两者的关系是:V(s) 是对所有可能动作的Q值的加权平均。Q函数更为实用,因为它直接告诉我们在某个状态下“哪个动作最好”。 \section{Q-Learning}\label{q-learning} @@ -137,7 +137,7 @@ DQN的两个关键创新: \textbf{经验回放(Experience Replay)}:将智能体的经历 (s, a, r, s') 存储在回放缓冲区中,训练时随机采样小批量数据。这打破了数据之间的时间相关性,提高了训练稳定性。 -\textbf{目标网络(Target Network)}:使用一个独立的目标网络来计算目标值,每隔一定步数才更新。这避免了''追逐移动目标''的不稳定性。 +\textbf{目标网络(Target Network)}:使用一个独立的目标网络来计算目标值,每隔一定步数才更新。这避免了“追逐移动目标”的不稳定性。 \begin{lstlisting}[language=Python] # DQN核心思路伪代码 @@ -275,7 +275,7 @@ for s in range(n_states): \end{lstlisting} \begin{quote} -\textbf{小贴士}:这个简单示例展示了强化学习的核心思想——智能体不需要任何人告诉它''该怎么走'',它只通过不断尝试和接收奖励反馈,就自己发现了最优路径。这正是强化学习区别于监督学习的本质。 +\textbf{小贴士}:这个简单示例展示了强化学习的核心思想——智能体不需要任何人告诉它“该怎么走”,它只通过不断尝试和接收奖励反馈,就自己发现了最优路径。这正是强化学习区别于监督学习的本质。 \end{quote} @@ -373,7 +373,7 @@ Critic提供一个\textbf{基线(Baseline)},使得梯度估计的方差大 \[A(s, a) = Q(s, a) - V(s)\] -优势函数衡量的是''采取动作a比平均水平好多少''。如果A \textgreater{} 0,说明这个动作比期望的好,应该增加其概率;反之则降低。 +优势函数衡量的是“采取动作a比平均水平好多少”。如果A \textgreater{} 0,说明这个动作比期望的好,应该增加其概率;反之则降低。 \section{PPO:近端策略优化} @@ -463,9 +463,9 @@ A2C: 多个Worker同步更新 → 等待所有Worker完成,再统一更新 AlphaGo的核心技术组合: -\textbf{策略网络(Policy Network)}:学习''下一步应该下在哪里'',输入棋盘状态,输出每个位置落子的概率分布。 +\textbf{策略网络(Policy Network)}:学习“下一步应该下在哪里”,输入棋盘状态,输出每个位置落子的概率分布。 -\textbf{价值网络(Value Network)}:学习''当前局面谁更可能赢'',输入棋盘状态,输出一个-1到1之间的胜率评估。 +\textbf{价值网络(Value Network)}:学习“当前局面谁更可能赢”,输入棋盘状态,输出一个-1到1之间的胜率评估。 \textbf{蒙特卡洛树搜索(Monte Carlo Tree Search, MCTS)}:在策略网络的指导下进行前瞻搜索,通过模拟大量对局来评估每个候选落子点的价值。 @@ -512,7 +512,7 @@ AlphaZero用同一个框架掌握了三种完全不同的棋类: \end{longtable} } -AlphaZero的启示:\textbf{当我们摆脱对人类数据的依赖,让AI完全通过自我探索来学习时,它可能发现人类从未想到过的策略}。在对弈中,AlphaZero经常下出人类专家认为''错误''的棋,最终却证明是更优的选择。 +AlphaZero的启示:\textbf{当我们摆脱对人类数据的依赖,让AI完全通过自我探索来学习时,它可能发现人类从未想到过的策略}。在对弈中,AlphaZero经常下出人类专家认为“错误”的棋,最终却证明是更优的选择。 \section{AlphaFold(2020)}\label{alphafold2020} @@ -560,10 +560,10 @@ AlphaFold的意义对设计领域尤其深远: └──────────────────────────────────────────┘ \end{lstlisting} -这一范式对设计领域的启示:复杂的设计问题(如城市规划、建筑布局)也可能通过''搜索 + 深度学习 + 计算''的组合来获得突破。 +这一范式对设计领域的启示:复杂的设计问题(如城市规划、建筑布局)也可能通过“搜索 + 深度学习 + 计算”的组合来获得突破。 \begin{quote} -\textbf{从游戏AI到科学发现}:Alpha系列的演进轨迹——从游戏(封闭规则、明确目标)到蛋白质折叠(开放规则、复杂约束)——暗示了强化学习从''玩具问题''走向''真实世界问题''的趋势。设计领域正是这种真实世界问题的重要阵地。 +\textbf{从游戏AI到科学发现}:Alpha系列的演进轨迹——从游戏(封闭规则、明确目标)到蛋白质折叠(开放规则、复杂约束)——暗示了强化学习从“玩具问题”走向“真实世界问题”的趋势。设计领域正是这种真实世界问题的重要阵地。 \end{quote} @@ -588,7 +588,7 @@ AlphaFold的意义对设计领域尤其深远: \textbf{对齐(Alignment)} 的目标是让AI模型的行为符合人类的价值观和期望,使其成为安全、有用、诚实的助手。而\textbf{RLHF(Reinforcement Learning from Human Feedback)} 是目前最成功的对齐方法。 \begin{quote} -\textbf{回顾第3章}:在第3章中我们了解了Transformer架构和语言模型的预训练过程。预训练赋予模型''能力'',而RLHF赋予模型''方向''——让能力服务于人类的目标。 +\textbf{回顾第3章}:在第3章中我们了解了Transformer架构和语言模型的预训练过程。预训练赋予模型“能力”,而RLHF赋予模型“方向”——让能力服务于人类的目标。 \end{quote} \section{RLHF:从人类反馈中学习} @@ -669,7 +669,7 @@ for step in range(training_steps): RLHF需要大量人工标注,成本高昂。\textbf{RLAIF(Reinforcement Learning from AI Feedback)} 用AI替代人类标注者来提供反馈: -\textbf{Constitutional AI(宪法AI)} 由Anthropic提出,其核心思想是让AI通过一组''宪法原则''进行自我纠正: +\textbf{Constitutional AI(宪法AI)} 由Anthropic提出,其核心思想是让AI通过一组“宪法原则”进行自我纠正: \begin{lstlisting} Constitutional AI 流程: @@ -699,9 +699,9 @@ Constitutional AI 流程: \section{什么是具身智能?} -\textbf{具身智能(Embodied AI)} 是指拥有物理或虚拟''身体''的AI系统,它通过与真实或模拟环境的物理交互来学习和完成任务。 +\textbf{具身智能(Embodied AI)} 是指拥有物理或虚拟“身体”的AI系统,它通过与真实或模拟环境的物理交互来学习和完成任务。 -传统AI(如大语言模型)是一个''缸中之脑''——只有信息处理能力,没有物理交互。具身智能则强调\textbf{感知-决策-行动}的闭环: +传统AI(如大语言模型)是一个“缸中之脑”——只有信息处理能力,没有物理交互。具身智能则强调\textbf{感知-决策-行动}的闭环: \begin{lstlisting} ┌───────────────────────────────────────────┐ @@ -850,7 +850,7 @@ MuJoCo系列 & 物理仿真 & 材料与结构 \\ \section{设计应用} -强化学习为设计领域提供了从''被动工具''到''主动智能体''的范式转变。以下是一些具有代表性的应用场景。 +强化学习为设计领域提供了从“被动工具”到“主动智能体”的范式转变。以下是一些具有代表性的应用场景。 \section{空间布局优化} @@ -875,7 +875,7 @@ MuJoCo系列 & 物理仿真 & 材料与结构 \\ - 空间浪费惩罚 \end{lstlisting} -与传统优化算法相比,强化学习方法的优势在于能够学习到布局的''风格''和''策略'',而不仅是找到单一最优解。 +与传统优化算法相比,强化学习方法的优势在于能够学习到布局的“风格”和“策略”,而不仅是找到单一最优解。 \section{路径规划与导航} From fa7d851bacb953ebc4f6627a2ff5c42a85a005d1 Mon Sep 17 00:00:00 2001 From: xiaopeng <1509442308@qq.com> Date: Fri, 29 May 2026 14:10:44 +0800 Subject: [PATCH 4/9] =?UTF-8?q?fix(latex):=20=E4=BF=AE=E5=A4=8D=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E5=BC=95=E5=8F=B7=E9=81=97=E6=BC=8F=EF=BC=8C=E8=A1=A5?= =?UTF-8?q?=E4=B8=81=20``...''=20=E2=86=92=20"..."=EF=BC=8815=E5=A4=84?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上次修复了 ''...'' 模式,遗漏了 ``...'' 包裹中文的情况。 补充修复 ch02-ch08 及 ap01-ap02 中的混合引号。 Co-Authored-By: Claude Opus 4.7 --- appendices/ap01-programming.tex | 4 ++-- appendices/ap02-vibe-coding.tex | 4 ++-- chapters/ch02-framework.tex | 2 +- chapters/ch03-1d-sequence.tex | 4 ++-- chapters/ch04-2d-vision.tex | 2 +- chapters/ch05-3d-spatial.tex | 8 ++++---- chapters/ch06-generative.tex | 4 ++-- chapters/ch07-agent.tex | 2 +- chapters/ch08-rl.tex | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/appendices/ap01-programming.tex b/appendices/ap01-programming.tex index 71c9c6f..dcd3289 100644 --- a/appendices/ap01-programming.tex +++ b/appendices/ap01-programming.tex @@ -99,7 +99,7 @@ AutoDL & 按时计费 & 中期项目 \\ \paragraph{软件安装与运行} -\textbf{``安装''的本质就是}:把编译好的二进制文件放到 PATH 某个目录下,让 shell 能找到它。例如git的安装和使用: \textbf{总结:三层抽象} +\textbf{“安装”的本质就是}:把编译好的二进制文件放到 PATH 某个目录下,让 shell 能找到它。例如git的安装和使用: \textbf{总结:三层抽象} ┌─────────────────────────────────────────────┐\\ │ 用户层:brew install git / git clone │ ← 你看到的\\ @@ -289,7 +289,7 @@ pip install torch torchvision \subparagraph{Python概述与特点}\label{pythonux6982ux8ff0ux4e0eux7279ux70b9} -Python由Guido van Rossum于1991年发布,以“优雅”\,``简洁“\,``可读性强”为设计哲学。它是当前AI和数据科学领域使用最广泛的编程语言。 +Python由Guido van Rossum于1991年发布,以”优雅”\,”简洁”\,”可读性强”为设计哲学。它是当前AI和数据科学领域使用最广泛的编程语言。 \textbf{核心特点}: - 语法简洁,接近自然语言,入门门槛低 - 丰富的第三方库生态(AI、数据处理、Web等) - 跨平台运行(Windows、macOS、Linux) - 活跃的开源社区支持 diff --git a/appendices/ap02-vibe-coding.tex b/appendices/ap02-vibe-coding.tex index 1f2cb60..ec685d0 100644 --- a/appendices/ap02-vibe-coding.tex +++ b/appendices/ap02-vibe-coding.tex @@ -20,7 +20,7 @@ Vibe Coding是一种以AI为核心的编程新模式:开发者用自然语言 \textbf{描述意图}:用自然语言说明需求 \end{enumerate} -``帮我创建一个简单的图像分类模型'' +“帮我创建一个简单的图像分类模型” \begin{enumerate} \def\labelenumi{\arabic{enumi}.} @@ -33,7 +33,7 @@ Vibe Coding是一种以AI为核心的编程新模式:开发者用自然语言 \textbf{迭代优化}:通过对话逐步改进 \end{enumerate} -``把隐藏层改成128个神经元'' +“把隐藏层改成128个神经元” \begin{enumerate} \def\labelenumi{\arabic{enumi}.} diff --git a/chapters/ch02-framework.tex b/chapters/ch02-framework.tex index 6d6116c..fb0be03 100644 --- a/chapters/ch02-framework.tex +++ b/chapters/ch02-framework.tex @@ -315,7 +315,7 @@ AI同样需要针对不同模态的数据采用不同的处理方式。一种数 通过在大规模无标注数据上的预训练,模型学习通用知识,再通过微调(Fine-tuning)适配具体任务。迁移学习使得少量标注数据也能获得优秀性能。 -特点: - 先预训练学通用知识,再微调适配任务 - 大幅减少对标注数据的依赖 - 模型开始具备迁移和泛化能力 - ``预训练+微调''成为标准范式 +特点: - 先预训练学通用知识,再微调适配任务 - 大幅减少对标注数据的依赖 - 模型开始具备迁移和泛化能力 - “预训练+微调”成为标准范式 \textbf{第四阶段:大模型时代(Foundation Models)} diff --git a/chapters/ch03-1d-sequence.tex b/chapters/ch03-1d-sequence.tex index 7b5c793..f35592e 100644 --- a/chapters/ch03-1d-sequence.tex +++ b/chapters/ch03-1d-sequence.tex @@ -4,7 +4,7 @@ 一维数据(1D Data)是人工智能处理的最基础、也是最重要的数据形态。你正在阅读的文字、你说出的一句话、股票市场的价格走势、建筑室内温度随时间的变化——这些都是一维序列数据。 -与图像(二维)和三维模型(三维)不同,一维数据的核心特征是\textbf{有序性}:每一个元素的含义不仅取决于它本身,还取决于它在序列中的位置以及与前后元素的关系。``我吃饭了“和”饭我吃了''虽然包含相同的字,但含义截然不同——这就是序列的魅力与挑战。 +与图像(二维)和三维模型(三维)不同,一维数据的核心特征是\textbf{有序性}:每一个元素的含义不仅取决于它本身,还取决于它在序列中的位置以及与前后元素的关系。“我吃饭了“和”饭我吃了”虽然包含相同的字,但含义截然不同——这就是序列的魅力与挑战。 本章将带你踏上一段激动人心的技术演进之旅:从早期的小型循环神经网络(RNN),到注意力机制的革命性突破,再到 Transformer 架构的横空出世,最终见证大语言模型(LLM)如何改变整个 AI 格局。这条从小模型到大模型的技术脉络,不仅是深度学习最精彩的故事之一,也直接关系到今天每一位设计师如何使用 AI 工具。 @@ -110,7 +110,7 @@ RNN(Recurrent Neural Network)通过\textbf{隐藏状态}(Hidden State) y_t = W_hy · h_t + b_y \end{lstlisting} -其中: - \passthrough{\lstinline!x\_t!}:时刻 t 的输入 - \passthrough{\lstinline!h\_\{t-1\}!}:上一时刻的隐藏状态(``记忆'') - \passthrough{\lstinline!h\_t!}:当前时刻的隐藏状态 - \passthrough{\lstinline!W\_hh, W\_xh, W\_hy!}:可学习的权重矩阵 +其中: - \passthrough{\lstinline!x\_t!}:时刻 t 的输入 - \passthrough{\lstinline!h\_\{t-1\}!}:上一时刻的隐藏状态("记忆") - \passthrough{\lstinline!h\_t!}:当前时刻的隐藏状态 - \passthrough{\lstinline!W\_hh, W\_xh, W\_hy!}:可学习的权重矩阵 \subsection{直观理解} diff --git a/chapters/ch04-2d-vision.tex b/chapters/ch04-2d-vision.tex index 44d8a63..b7cb805 100644 --- a/chapters/ch04-2d-vision.tex +++ b/chapters/ch04-2d-vision.tex @@ -976,7 +976,7 @@ DINOv2学到的特征具有惊人的语义对齐能力——无需文本训练 \section{本章小结} -本章沿着\textbf{``CNN → 目标检测/语义分割 → Vision Transformer → 大视觉模型''}的技术演进主线,系统介绍了计算机视觉的核心方法和前沿进展。 +本章沿着\textbf{“CNN → 目标检测/语义分割 → Vision Transformer → 大视觉模型”}的技术演进主线,系统介绍了计算机视觉的核心方法和前沿进展。 \begin{lstlisting} 技术演进脉络 diff --git a/chapters/ch05-3d-spatial.tex b/chapters/ch05-3d-spatial.tex index 9f7c39e..e86fbbd 100644 --- a/chapters/ch05-3d-spatial.tex +++ b/chapters/ch05-3d-spatial.tex @@ -107,7 +107,7 @@ \subsection{体素 (Voxel)} -\textbf{定义}:三维空间中的规则网格单元,是二维像素 (Pixel) 在三维空间的推广——``三维像素''。 +\textbf{定义}:三维空间中的规则网格单元,是二维像素 (Pixel) 在三维空间的推广——“三维像素”。 \begin{lstlisting} 体素网格: @@ -1121,10 +1121,10 @@ print(f"颜色形状: {color.shape}, 密度形状: {density.shape}") \endhead \bottomrule\noalign{} \endlastfoot -空间问答 (Spatial QA) & 图像 + 问题 & 文字答案 & ``这栋建筑有几层?'' \\ +空间问答 (Spatial QA) & 图像 + 问题 & 文字答案 & “这栋建筑有几层?” \\ 空间关系描述 & 3D场景 & 关系三元组 & (树, 在\ldots 前面, 建筑) \\ -导航指令 & 语言指令 & 路径/动作 & ``走到窗边左转'' \\ -场景变化检测 & 两个时刻的场景 & 变化描述 & ``左侧新增了一棵树'' \\ +导航指令 & 语言指令 & 路径/动作 & “走到窗边左转” \\ +场景变化检测 & 两个时刻的场景 & 变化描述 & “左侧新增了一棵树” \\ \end{longtable} } diff --git a/chapters/ch06-generative.tex b/chapters/ch06-generative.tex index 6f85b29..b2151e2 100644 --- a/chapters/ch06-generative.tex +++ b/chapters/ch06-generative.tex @@ -315,7 +315,7 @@ CLIP & 文图对齐 & 确保生成的图像与文本描述语义一致 \\ \item \textbf{质量修饰}:如“高清”\,``细节丰富“``4K” \item - \textbf{光照氛围}:如“黄金时段光线”\,``柔和阴影'' + \textbf{光照氛围}:如“黄金时段光线”\,“柔和阴影” \end{itemize} \begin{quote} @@ -404,7 +404,7 @@ Canny边缘 & Canny Edge & 检测图像轮廓 & 草图控制、线稿渲染 \\ 基础模型 + LoRA_A + LoRA_B = 混合风格生成 \end{lstlisting} -设计师可以针对特定设计风格训练专属LoRA,如“新中式风格”\,``日式极简风格''等,实现个性化的AI生成。 +设计师可以针对特定设计风格训练专属LoRA,如“新中式风格”\,“日式极简风格”等,实现个性化的AI生成。 \subsection{ComfyUI:模块化工作流} diff --git a/chapters/ch07-agent.tex b/chapters/ch07-agent.tex index 57924aa..670e4e4 100644 --- a/chapters/ch07-agent.tex +++ b/chapters/ch07-agent.tex @@ -203,7 +203,7 @@ CoT是最基础的推理增强技术,核心思想是\textbf{将推理过程显 问题 → 推理链(一步步思考) → 答案 \end{lstlisting} -\textbf{设计示例——``设计一个公园'':} +\textbf{设计示例——“设计一个公园”:} \begin{lstlisting} 问题:"在3000㎡的社区用地上设计一个公园" diff --git a/chapters/ch08-rl.tex b/chapters/ch08-rl.tex index 4101995..395cace 100644 --- a/chapters/ch08-rl.tex +++ b/chapters/ch08-rl.tex @@ -645,7 +645,7 @@ RLHF分为三个阶段: 在这个阶段,SFT模型成为RL的智能体: - \textbf{状态}:用户的问题 - \textbf{动作}:生成的回答 - \textbf{奖励}:奖励模型给出的分数 - \textbf{算法}:PPO,保证训练的稳定性 -同时,通过\textbf{KL散度惩罚(KL Divergence Penalty)} 约束模型不要偏离原始SFT模型太远,防止''奖励黑客(Reward Hacking)``——模型学会生成奖励模型给高分但实际无意义的内容。 +同时,通过\textbf{KL散度惩罚(KL Divergence Penalty)} 约束模型不要偏离原始SFT模型太远,防止"奖励黑客(Reward Hacking)"——模型学会生成奖励模型给高分但实际无意义的内容。 \begin{lstlisting}[language=Python] # RLHF第三阶段伪代码 From 491ba89892e42f3b311654b6f3685c07d2dfe7f9 Mon Sep 17 00:00:00 2001 From: xiaopeng <1509442308@qq.com> Date: Fri, 29 May 2026 14:25:21 +0800 Subject: [PATCH 5/9] =?UTF-8?q?refactor(officefile):=20=E6=8C=89=20md/late?= =?UTF-8?q?x/word=20=E4=B8=89=E5=B1=82=E7=BB=93=E6=9E=84=E9=87=8D=E7=BB=84?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 Markdown 源文件移入 md/,LaTeX 工作目录保留在 latex/, Word 导出移入 word/;删除临时脚本、调试截图和空 stub。 Co-Authored-By: Claude Opus 4.7 --- _fix_headings.py | 44 ------------------------------------ chapters/ch00-preface.tex | 14 ++++++------ chapters/ch13-conclusion.tex | 4 ---- main.tex | 3 --- 4 files changed, 7 insertions(+), 58 deletions(-) delete mode 100644 _fix_headings.py delete mode 100644 chapters/ch13-conclusion.tex diff --git a/_fix_headings.py b/_fix_headings.py deleted file mode 100644 index 06dfe6e..0000000 --- a/_fix_headings.py +++ /dev/null @@ -1,44 +0,0 @@ -"""Fix H1 headings in md files: keep first # as chapter, demote rest to ##.""" -import os - -base = r'e:/Project/SI/2026_DesignAI/officefile' - -files_to_fix = [ - '01-introduction/01-introduction.md', - '03-1d-sequence/03-1d-sequence.md', - '05-3d-spatial/05-3d-spatial.md', - '08-reinforcement/08-reinforcement.md', -] - -for rel_path in files_to_fix: - fpath = os.path.join(base, rel_path) - with open(fpath, 'r', encoding='utf-8') as f: - lines = f.readlines() - - seen_first_h1 = False - changes = 0 - in_code_block = False - - for i, line in enumerate(lines): - # Track fenced code blocks - if line.startswith('```'): - in_code_block = not in_code_block - continue - - if in_code_block: - continue - - # Only target H1 headings (start with "# " but not "## ") - if line.startswith('# ') and not line.startswith('## '): - if not seen_first_h1: - seen_first_h1 = True - continue # Keep the first H1 as chapter title - - # Demote: "# heading" -> "## heading" - lines[i] = '#' + line # "# " -> "## " - changes += 1 - - with open(fpath, 'w', encoding='utf-8') as f: - f.writelines(lines) - - print(f'{rel_path}: demoted {changes} H1 -> H2 (kept first as chapter)') diff --git a/chapters/ch00-preface.tex b/chapters/ch00-preface.tex index c4195eb..7d4a8d2 100644 --- a/chapters/ch00-preface.tex +++ b/chapters/ch00-preface.tex @@ -5,17 +5,17 @@ 2022年底,ChatGPT的发布如同一声惊雷,让生成式人工智能一夜之间走入大众视野。此后短短两年间,AI技术以惊人的速度迭代演进——从文本对话到多模态理解,从被动应答到自主行动,从实验室探索到千行百业的应用落地。在这场技术变革中,设计领域受到的冲击尤为深远。AI不仅能生成图像、辅助建模、优化方案,更在根本上改变了“设计”这件事的范式:设计师的角色正在从“执行者”转变为“引导者”和“策展人”,从亲手绘制每一个细节,转变为与AI协同探索更大的创意空间。 然而,观察众多设计专业的师生和从业者的实际状态后,可以发现一个普遍的困境:\textbf{大家都在谈论AI,但真正理解AI并能有效运用AI的人并不多。} -多数人对AI的使用停留在"输入提示词、获取结果"的表层,缺乏对技术原理的理解,也难以将AI真正融入自己的专业工作流。特别是对于设计专业的学生和从业者而言,虽然了解并使用了许多AI工具,但对很多专业术语和概念的理解仍停留在表面,难以触及背后的原理,这在很大程度上限制了研究与实践的深入。 +多数人对AI的使用停留在“输入提示词、获取结果”的表层,缺乏对技术原理的理解,也难以将AI真正融入自己的专业工作流。特别是对于设计专业的学生和从业者而言,虽然了解并使用了许多AI工具,但对很多专业术语和概念的理解仍停留在表面,难以触及背后的原理,这在很大程度上限制了研究与实践的深入。 -尤其对于设计专业的学生来说,由于接触计算机和编程较少,缺乏进入这一领域的"语境",容易产生畏难情绪。而事实上,AI领域所涉及的终究是技术工程问题,并不存在玄学,在这个意义上理应能够被所有人掌握。梳理进入AI领域所需要的基本知识,归纳现代AI技术涉及的核心原理与沉淀的经验,并展示如何将其应用于设计学领域——从而为设计专业的学生、研究者和设计师提供切实的帮助,这正是本书的出发点。 +尤其对于设计专业的学生来说,由于接触计算机和编程较少,缺乏进入这一领域的“语境”,容易产生畏难情绪。而事实上,AI领域所涉及的终究是技术工程问题,并不存在玄学,在这个意义上理应能够被所有人掌握。梳理进入AI领域所需要的基本知识,归纳现代AI技术涉及的核心原理与沉淀的经验,并展示如何将其应用于设计学领域——从而为设计专业的学生、研究者和设计师提供切实的帮助,这正是本书的出发点。 \section{这本书讲什么} 本书分为上下两篇,试图回答两个核心问题: -\textbf{上篇}回答"AI是什么"——系统讲解AI的核心技术原理。面向设计专业读者,不追求面面俱到的数学推导,而是强调直觉理解:把神经网络看作函数组合,把注意力机制看作信息检索,把扩散模型看作逐步去噪。理解了这些基本原理,面对层出不穷的新工具和新模型,才能做到心中有数。 +\textbf{上篇}回答“AI是什么”——系统讲解AI的核心技术原理。面向设计专业读者,不追求面面俱到的数学推导,而是强调直觉理解:把神经网络看作函数组合,把注意力机制看作信息检索,把扩散模型看作逐步去噪。理解了这些基本原理,面对层出不穷的新工具和新模型,才能做到心中有数。 -\textbf{下篇}回答"AI能做什么"——聚焦五大设计领域的AI应用实践。从数字媒体到环境设计,从工业设计到城市规划,再到生态设计,每个领域都结合具体场景,展示AI如何辅助分析、生成、优化和评估。 +\textbf{下篇}回答“AI能做什么”——聚焦五大设计领域的AI应用实践。从数字媒体到环境设计,从工业设计到城市规划,再到生态设计,每个领域都结合具体场景,展示AI如何辅助分析、生成、优化和评估。 此外,附录中包含了大量与计算机和AI相关的基础知识与编程环境内容。虽然网络上有许多资源可供查询,但附录所收录的是实践过程中被认为最有必要了解和掌握的基本知识,也是开展设计人工智能研究的基础,因此以相当的篇幅进行了总结。更为详细的内容,可以参考书中所列的文献与技术文档资料。 @@ -25,7 +25,7 @@ \textbf{原理先行}。理解原理比掌握工具更重要。工具会过时,但原理具有持久的价值。因此,上篇用了较大篇幅讲解神经网络、注意力机制、扩散模型等核心概念。 -\textbf{函数式视角}。本书刻意避免一上来就堆砌数学公式,而是从"函数描述世界"的朴素观念出发,让读者理解神经网络的本质——通过函数组合来学习数据中的规律。 +\textbf{函数式视角}。本书刻意避免一上来就堆砌数学公式,而是从“函数描述世界”的朴素观念出发,让读者理解神经网络的本质——通过函数组合来学习数据中的规律。 \textbf{案例驱动}。每个技术概念都尽量配以设计领域的应用案例,让抽象的原理变得具体可感。 @@ -35,9 +35,9 @@ AI技术仍在飞速发展,本书的内容不可避免地会随着时间推移而需要更新。但书中所传达的核心思想——理解原理、拥抱工具、人机协作——将具有持久的价值。 -感谢AI技术本身——本书的写作过程中广泛使用了Claude Code等AI工具进行资料整理、内容润色和代码验证,这本身就是"AI赋能工作"的一次实践。 +感谢AI技术本身——本书的写作过程中广泛使用了Claude Code等AI工具进行资料整理、内容润色和代码验证,这本身就是“AI赋能工作”的一次实践。 -设计的人工智能时代才刚刚开始。希望这本书能成为读者进入这个新时代的一块踏脚石,从而汇聚起万千努力,能够成为点燃"通用设计智能"的星星之火。 +设计的人工智能时代才刚刚开始。希望这本书能成为读者进入这个新时代的一块踏脚石,从而汇聚起万千努力,能够成为点燃“通用设计智能”的星星之火。 \begin{flushright} diff --git a/chapters/ch13-conclusion.tex b/chapters/ch13-conclusion.tex deleted file mode 100644 index a7f09a8..0000000 --- a/chapters/ch13-conclusion.tex +++ /dev/null @@ -1,4 +0,0 @@ -\chapter{第13章 结语与展望} - -对方的v - diff --git a/main.tex b/main.tex index b2da310..3263f76 100644 --- a/main.tex +++ b/main.tex @@ -43,9 +43,6 @@ \input{chapters/ch11-environment} \input{chapters/ch12-urban} -% 结语 -\input{chapters/ch13-conclusion} - % ---------- 附录部分 ---------- \appendix \input{appendices/ap00-divider} From c55f956656cdbdd7c24c12d177e6898ed90af062 Mon Sep 17 00:00:00 2001 From: xiaopeng <1509442308@qq.com> Date: Fri, 29 May 2026 15:13:27 +0800 Subject: [PATCH 6/9] =?UTF-8?q?sync(latex):=20=E4=BB=8E=20Word=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E7=AC=AC=E4=BA=8C=E7=AB=A0=E5=92=8C=E9=99=84=E5=BD=95?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ch02: 第5节重写为"环境-智能体框架",新增表2.1/2.2和图2.1 - ch01: 补充 Garrity 引用来源 - 全部附录(ap01-ap09)从 Word 重新转换,修复 \sub 等转换错误 - 新增 ch13 结语占位、上下篇分隔页 Co-Authored-By: Claude Opus 4.7 --- appendices/ap00-divider.tex | 4 +- appendices/ap01-programming.tex | 404 ++++---- appendices/ap02-vibe-coding.tex | 235 +++-- appendices/ap03-academic-writing.tex | 45 +- appendices/ap04-web-tools.tex | 170 ++-- appendices/ap05-online-resources.tex | 48 +- appendices/ap06-more-resources.tex | 47 +- appendices/ap07-references.tex | 3 +- appendices/ap08-glossary.tex | 26 +- appendices/ap09-tips.tex | 5 +- chapters/ch01-intro.tex | 340 +++---- chapters/ch02-framework.tex | 1302 +++++++++++++------------- chapters/ch13-conclusion.tex | 49 + chapters/divider-lower.tex | 2 + chapters/divider-upper.tex | 2 + main.tex | 5 + 16 files changed, 1414 insertions(+), 1273 deletions(-) create mode 100644 chapters/ch13-conclusion.tex create mode 100644 chapters/divider-lower.tex create mode 100644 chapters/divider-upper.tex diff --git a/appendices/ap00-divider.tex b/appendices/ap00-divider.tex index a7ac3ae..05d4efc 100644 --- a/appendices/ap00-divider.tex +++ b/appendices/ap00-divider.tex @@ -1,2 +1,2 @@ -\chapter{附录} - +\chapter*{附录} +\addcontentsline{toc}{chapter}{附录} diff --git a/appendices/ap01-programming.tex b/appendices/ap01-programming.tex index dcd3289..fe2d08e 100644 --- a/appendices/ap01-programming.tex +++ b/appendices/ap01-programming.tex @@ -1,18 +1,18 @@ -\chapter{附录1:计算机基础与编程环境} +\chapter{计算机基础与编程环境} 本附录介绍计算机的基本构成、操作系统常见操作、程序设计语言的概念、Python编程语言的系统学习指南,以及机器学习与深度学习的实践入门。 -\subsubsection{计算机的基本构成与操作系统常见操作} +\subsection{计算机的基本构成与操作系统常见操作} -\paragraph{计算机基本构成} +\subsubsection{计算机基本构成} 了解计算机的基本组成有助于理解AI程序运行时的资源需求。 {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2194}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2599}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3778}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2368}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3026}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4342}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 组件 @@ -33,11 +33,12 @@ GPU & 图形处理器,并行计算 & 深度学习训练与推理的核心硬 \end{longtable} } -\paragraph{操作系统常见操作} +\subsubsection{操作系统常见操作} -本书以 macOS/Linux 为主要环境,Windows 用户推荐使用 WSL2(Windows Subsystem for Linux)。 +本书以 macOS/Linux 为主要环境,Windows 用户推荐使用 WSL2(Windows +Subsystem for Linux)。 -\subparagraph{文件与目录操作:} +\paragraph{文件与目录操作:} \emph{\# 查看当前路径}\\ pwd\\ @@ -56,7 +57,7 @@ cp file.txt backup.txt\\ mv old.txt new.txt\\ rm unwanted.txt -\subparagraph{环境与进程管理:} +\paragraph{环境与进程管理:} \emph{\# 查看系统资源}\\ top \emph{\# CPU和内存使用}\\ @@ -67,17 +68,18 @@ nvidia-smi \emph{\# GPU状态(NVIDIA显卡)}\\ brew install xxx \emph{\# macOS Homebrew}\\ apt install xxx \emph{\# Ubuntu/Debian} -\paragraph{硬件资源推荐} +\subsubsection{硬件资源推荐} -\textbf{本地GPU配置}: - GPU:RTX 3060 (12GB) 或更高 - 内存:16GB+ - 存储:至少100GB SSD +\textbf{本地GPU配置}: - GPU:RTX 3060 (12GB) 或更高 - 内存:16GB+ - +存储:至少100GB SSD \textbf{云平台}: {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2003}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1245}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2639}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1528}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1528}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 平台 @@ -97,9 +99,11 @@ AutoDL & 按时计费 & 中期项目 \\ \end{longtable} } -\paragraph{软件安装与运行} +\subsubsection{软件安装与运行} -\textbf{“安装”的本质就是}:把编译好的二进制文件放到 PATH 某个目录下,让 shell 能找到它。例如git的安装和使用: \textbf{总结:三层抽象} +\textbf{``安装''的本质就是}:把编译好的二进制文件放到 PATH +某个目录下,让 shell 能找到它。例如git的安装和使用: +\textbf{总结:三层抽象} ┌─────────────────────────────────────────────┐\\ │ 用户层:brew install git / git clone │ ← 你看到的\\ @@ -111,23 +115,26 @@ AutoDL & 按时计费 & 中期项目 \\ │ 硬件层:CPU 执行指令、网卡收发数据、磁盘写入 │ ← 物理上发生了什么\\ └─────────────────────────────────────────────┘ -所以整个链条是:\textbf{包管理器下载编译好的二进制 → 放到 PATH 目录 → shell 通过 PATH 找到它 → execve 加载到内存 →} +所以整个链条是:\textbf{包管理器下载编译好的二进制 → 放到 PATH 目录 → +shell 通过 PATH 找到它 → execve 加载到内存 →} -\textbf{二进制内部调用 OS API 完成实际工作}。没有任何“魔法”,本质上就是文件操作和进程管理的组合。 +\textbf{二进制内部调用 OS API +完成实际工作}。没有任何“魔法”,本质上就是文件操作和进程管理的组合。 -\subsubsection{程序设计语言与软件开发} +\subsection{程序设计语言与软件开发} -\paragraph{什么是程序设计语言} +\subsubsection{什么是程序设计语言} -计算机只能执行由0和1组成的\textbf{机器码}(machine code),但人类直接阅读和编写机器码极其困难。程序设计语言就是人与计算机之间的桥梁------用人类可读的语法表达逻辑,再通过特定工具转换为机器可执行的指令。 +计算机只能执行由0和1组成的\textbf{机器码}(machine +code),但人类直接阅读和编写机器码极其困难。程序设计语言就是人与计算机之间的桥梁——用人类可读的语法表达逻辑,再通过特定工具转换为机器可执行的指令。 从底层到高层的演进: {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2548}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4249}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1429}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3506}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4805}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 层级 @@ -147,7 +154,7 @@ AutoDL & 按时计费 & 中期项目 \\ \end{longtable} } -\paragraph{编译型与解释型语言} +\subsubsection{编译型与解释型语言} 高级语言需要转换为机器码才能运行,根据转换方式的不同,分为两大类: @@ -175,16 +182,17 @@ Ruby:Web开发(Ruby on Rails) 特点:开发灵活、调试方便,但运行速度通常慢于编译型语言。 -\textbf{混合模式}:Java 采用“编译为字节码 → 虚拟机解释执行”的混合方式,兼顾了跨平台和性能。 +\textbf{混合模式}:Java 采用“编译为字节码 → +虚拟机解释执行”的混合方式,兼顾了跨平台和性能。 -\paragraph{常见编程语言概览} +\subsubsection{常见编程语言概览} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1266}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.0951}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3546}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3258}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1512}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1047}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3605}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3605}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 语言 @@ -200,7 +208,8 @@ Ruby:Web开发(Ruby on Rails) \bottomrule\noalign{} \endlastfoot Python & 解释型 & AI、数据科学、自动化 & 本书主要编程语言 \\ -C/C++ & 编译型 & 操作系统、嵌入式、高性能计算 & 深度学习框架的底层实现 \\ +C/C++ & 编译型 & 操作系统、嵌入式、高性能计算 & +深度学习框架的底层实现 \\ Java & 混合型 & 企业应用、Android开发 & 大数据处理(Hadoop/Spark) \\ JavaScript & 解释型 & 网页前端、Node.js后端 & Web可视化、交互设计 \\ Shell/Bash & 解释型 & 命令行脚本、系统管理 & 自动化任务、环境管理 \\ @@ -208,15 +217,19 @@ SQL & 声明式 & 数据库查询 & 数据管理与提取 \\ \end{longtable} } -\textbf{命令行界面(CLI)}:CLI(Command Line Interface)是通过文本命令与计算机交互的方式。终端中输入的每一条命令(如 ls、git commit)本质上都是调用某个程序。掌握 CLI 是进行AI开发的基础技能,许多工具(如 conda、pip、git)主要通过命令行操作。 +\textbf{命令行界面(CLI)}:CLI(Command Line +Interface)是通过文本命令与计算机交互的方式。终端中输入的每一条命令(如 +ls、git commit)本质上都是调用某个程序。掌握 CLI +是进行AI开发的基础技能,许多工具(如 +conda、pip、git)主要通过命令行操作。 -\paragraph{软件开发基本概念} +\subsubsection{软件开发基本概念} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1379}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3042}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.5579}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1327}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3186}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.5310}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 概念 @@ -229,18 +242,21 @@ SQL & 声明式 & 数据库查询 & 数据管理与提取 \\ \endhead \bottomrule\noalign{} \endlastfoot -集成开发环境 & IDE & 集成代码编辑、调试、运行的开发工具(如 VS Code、PyCharm) \\ +集成开发环境 & IDE & 集成代码编辑、调试、运行的开发工具(如 VS +Code、PyCharm) \\ 编译器 & Compiler & 将源代码翻译为机器码的程序 \\ 解释器 & Interpreter & 逐行读取并执行源代码的程序 \\ 调试器 & Debugger & 帮助定位和修复代码错误的工具 \\ -包管理器 & Package Manager & 管理第三方库的安装和更新(如 pip、conda、npm) \\ -API & Application Programming Interface & 程序之间交互的接口(如调用AI模型的API) \\ +包管理器 & Package Manager & 管理第三方库的安装和更新(如 +pip、conda、npm) \\ +API & Application Programming Interface & +程序之间交互的接口(如调用AI模型的API) \\ 开源 & Open Source & 源代码公开,可自由使用和修改 \\ 版本控制 & Version Control & 管理代码的修改历史(如 Git) \\ \end{longtable} } -\paragraph{Python环境配置}\label{pythonux73afux5883ux914dux7f6e} +\subsubsection{Python环境配置} Python是本书使用的核心编程语言,以下介绍环境搭建方法。 @@ -248,10 +264,10 @@ Anaconda vs Miniconda {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1265}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1092}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1422}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1599}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1165}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.0971}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1262}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.6408}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 工具 @@ -266,8 +282,10 @@ Anaconda vs Miniconda \endhead \bottomrule\noalign{} \endlastfoot -Anaconda & \textasciitilde500MB & 预装常用库 & \href{https://www.anaconda.com/download}{anaconda.com} \\ -Miniconda & \textasciitilde50MB & 精简安装 & \href{https://docs.conda.io/en/latest/miniconda.html}{docs.conda.io} \\ +Anaconda & \textasciitilde500MB & 预装常用库 & +\href{https://www.anaconda.com/download}{anaconda.com} \\ +Miniconda & \textasciitilde50MB & 精简安装 & +\href{https://docs.conda.io/en/latest/miniconda.html}{docs.conda.io} \\ \end{longtable} } @@ -285,15 +303,18 @@ conda install numpy pandas scipy\\ \# 4. 安装深度学习框架\\ pip install torch torchvision -\subsubsection{Python编程语言}\label{pythonux7f16ux7a0bux8bedux8a00} +\subsection{Python编程语言} -\subparagraph{Python概述与特点}\label{pythonux6982ux8ff0ux4e0eux7279ux70b9} +\paragraph{Python概述与特点} -Python由Guido van Rossum于1991年发布,以”优雅”\,”简洁”\,”可读性强”为设计哲学。它是当前AI和数据科学领域使用最广泛的编程语言。 +Python由Guido van +Rossum于1991年发布,以“优雅”\,``简洁“``可读性强”为设计哲学。它是当前AI和数据科学领域使用最广泛的编程语言。 -\textbf{核心特点}: - 语法简洁,接近自然语言,入门门槛低 - 丰富的第三方库生态(AI、数据处理、Web等) - 跨平台运行(Windows、macOS、Linux) - 活跃的开源社区支持 +\textbf{核心特点}: - 语法简洁,接近自然语言,入门门槛低 - +丰富的第三方库生态(AI、数据处理、Web等) - +跨平台运行(Windows、macOS、Linux) - 活跃的开源社区支持 -\subparagraph{基础语法} +\paragraph{基础语法} 变量与数据类型 @@ -304,7 +325,8 @@ chapter\_count = 26 \emph{\# 整数 int}\\ is\_published = True \emph{\# 布尔值 bool}\\ \strut \\ \emph{\# 查看类型}\\ -print(type(name)) \emph{\# \textless class \textquotesingle str\textquotesingle\textgreater{}} +print(type(name)) \emph{\# \textless class +\textquotesingle str\textquotesingle\textgreater{}} 字符串操作 @@ -332,7 +354,7 @@ print(len(title)) \emph{\# 长度} \strut \\ \emph{\# 好的注释解释"为什么",而不是"做什么"} -\subparagraph{数据结构} +\paragraph{数据结构} 列表(List) @@ -387,10 +409,9 @@ rgb = (255, 128, 0) \begin{enumerate} \def\labelenumi{\arabic{enumi}.} +\tightlist \item -\begin{verbatim} -g, b = rgb -\end{verbatim} + g, b = rgb \end{enumerate} 集合(Set) @@ -404,7 +425,7 @@ tools\_b = \{"Figma", "Blender", "Rhino"\}\\ print(tools\_a \& tools\_b) \emph{\# 交集: \{"Figma"\}}\\ print(tools\_a \textbar{} tools\_b) \emph{\# 并集} -\subparagraph{控制流} +\paragraph{控制流} 条件判断 @@ -446,9 +467,10 @@ squares.append(x ** 2)\\ squares = {[}x ** 2 \textbf{for} x \textbf{in} range(10){]}\\ \strut \\ \emph{\# 带条件过滤}\\ -even\_squares = {[}x ** 2 \textbf{for} x \textbf{in} range(10) \textbf{if} x \% 2 == 0{]} +even\_squares = {[}x ** 2 \textbf{for} x \textbf{in} range(10) +\textbf{if} x \% 2 == 0{]} -\subparagraph{函数与模块} +\paragraph{函数与模块} 定义函数 @@ -484,25 +506,19 @@ train\_model(100, optimizer="SGD", lr=0.1) \textbf{import} pandas \textbf{as} pd -\begin{verbatim} -\end{verbatim} - \emph{\# 从模块中导入特定功能} \textbf{from} pathlib \textbf{import} Path \textbf{from} collections \textbf{import} Counter -\begin{verbatim} -\end{verbatim} - \emph{\# 安装第三方库(在终端中执行)} -\begin{verbatim} +\begin{lstlisting} # pip install numpy pandas matplotlib -\end{verbatim} +\end{lstlisting} -\subparagraph{3.6 文件读写} +\paragraph{3.6 文件读写} \emph{\# 读取文件} @@ -518,9 +534,6 @@ content = f.read() print(line.strip()) -\begin{verbatim} -\end{verbatim} - \emph{\# 写入文件} \textbf{with} open("output.txt", "w", encoding="utf-8") \textbf{as} f: @@ -529,46 +542,35 @@ f.write("分析结果\textbackslash n") f.write(f"准确率: \{acc:.4f\}\textbackslash n") -\begin{verbatim} -\end{verbatim} - \emph{\# 读写JSON(AI应用中常用的数据格式)} \textbf{import} json -\begin{verbatim} -\end{verbatim} - data = \{"model": "ResNet", "accuracy": 0.96\} -\begin{verbatim} -\end{verbatim} - \emph{\# 写入JSON} \textbf{with} open("result.json", "w") \textbf{as} f: json.dump(data, f, indent=2) -\begin{verbatim} -\end{verbatim} - \emph{\# 读取JSON} \textbf{with} open("result.json", "r") \textbf{as} f: -\begin{verbatim} +\begin{lstlisting} loaded = json.load(f) -\end{verbatim} +\end{lstlisting} -\subparagraph{面向对象编程基础} +\paragraph{面向对象编程基础} 面向对象编程(OOP)是Python的重要范式,许多AI库都基于OOP设计。 \textbf{class} NeuralNetwork:\\ \emph{"""简单的神经网络类"""}\\ \strut \\ -\textbf{def} \_\_init\_\_(self, input\_size, hidden\_size, output\_size):\\ +\textbf{def} \_\_init\_\_(self, input\_size, hidden\_size, +output\_size):\\ \emph{"""初始化网络结构"""}\\ self.input\_size = input\_size\\ self.hidden\_size = hidden\_size\\ @@ -578,7 +580,8 @@ self.loss\_history = {[}{]}\\ \textbf{def} forward(self, x):\\ \emph{"""前向传播"""}\\ \emph{\# 这里简化为概念演示}\\ -\textbf{return} f"输出: 输入\{x\}经过\{self.hidden\_size\}个隐藏层神经元"\\ +\textbf{return} f"输出: +输入\{x\}经过\{self.hidden\_size\}个隐藏层神经元"\\ \strut \\ \textbf{def} train(self, data, epochs=10):\\ \emph{"""训练网络"""}\\ @@ -588,13 +591,14 @@ self.loss\_history.append(loss)\\ print(f"Epoch \{epoch+1\}, Loss: \{loss:.4f\}")\\ \strut \\ \emph{\# 创建实例}\\ -model = NeuralNetwork(input\_size=784, hidden\_size=128, output\_size=10)\\ +model = NeuralNetwork(input\_size=784, hidden\_size=128, +output\_size=10)\\ \strut \\ \emph{\# 使用}\\ output = model.forward({[}0.5, 0.3, 0.8{]})\\ model.train(data=None, epochs=5) -\paragraph{核心科学计算库} +\subsubsection{核心科学计算库} NumPy:数值计算基础 @@ -615,7 +619,7 @@ print(np.mean(x)) \emph{\# 均值}\\ print(np.std(x)) \emph{\# 标准差}\\ print(np.max(x)) \emph{\# 最大值} -\subparagraph{Pandas:数据处理}\label{pandasux6570ux636eux5904ux7406} +\paragraph{Pandas:数据处理} \textbf{import} pandas \textbf{as} pd\\ \strut \\ @@ -634,9 +638,10 @@ df = df.dropna() \emph{\# 删除缺失值}\\ print(df.describe()) \emph{\# 描述性统计}\\ \strut \\ \emph{\# 筛选数据}\\ -filtered = df{[}df{[}\textquotesingle accuracy\textquotesingle{]} \textgreater{} 0.9{]} +filtered = df{[}df{[}\textquotesingle accuracy\textquotesingle{]} +\textgreater{} 0.9{]} -\subparagraph{Matplotlib:数据可视化}\label{matplotlibux6570ux636eux53efux89c6ux5316} +\paragraph{Matplotlib:数据可视化} \textbf{import} matplotlib.pyplot \textbf{as} plt\\ \strut \\ @@ -651,16 +656,16 @@ plt.title(\textquotesingle Training Loss Curve\textquotesingle)\\ plt.savefig(\textquotesingle loss\_curve.png\textquotesingle, dpi=150)\\ plt.show() -\subsubsection{AI工具库速查与模型资源}\label{aiux5de5ux5177ux5e93ux901fux67e5ux4e0eux6a21ux578bux8d44ux6e90} +\subsection{AI工具库速查与模型资源} -\paragraph{工具库速查} +\subsubsection{工具库速查} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1422}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1383}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3840}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3081}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1340}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1443}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.4227}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2784}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 类别 @@ -676,17 +681,22 @@ plt.show() \bottomrule\noalign{} \endlastfoot 计算机视觉 & OpenCV & pip install opencv-python & 图像处理、视频分析 \\ -目标检测 & Ultralytics & pip install ultralytics & YOLO目标检测、实例分割 \\ -图像生成 & Diffusers & pip install diffusers & Stable Diffusion模型调用 \\ -Agent开发 & LangChain & pip install langchain langchain-openai & LLM应用开发框架 \\ +目标检测 & Ultralytics & pip install ultralytics & +YOLO目标检测、实例分割 \\ +图像生成 & Diffusers & pip install diffusers & Stable +Diffusion模型调用 \\ +Agent开发 & LangChain & pip install langchain langchain-openai & +LLM应用开发框架 \\ Agent开发 & LangGraph & pip install langgraph & 状态机式Agent开发 \\ -数据检索 & LlamaIndex & pip install llama-index & 数据索引与检索(RAG) \\ +数据检索 & LlamaIndex & pip install llama-index & +数据索引与检索(RAG) \\ \end{longtable} } -\paragraph{模型资源} +\subsubsection{模型资源} -\subparagraph{\texorpdfstring{Hugging Face:\href{https://huggingface.co/}{huggingface.co}}{Hugging Face:huggingface.co}}\label{hugging-facehuggingface.co} +\paragraph{\texorpdfstring{Hugging +Face:\href{https://huggingface.co/}{huggingface.co}}{Hugging Face:huggingface.co}}\label{hugging-facehuggingface.co} 功能:模型仓库、数据集、Spaces在线演示 @@ -694,9 +704,9 @@ Agent开发 & LangGraph & pip install langgraph & 状态机式Agent开发 \\ {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1421}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2163}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3845}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1625}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2750}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.5375}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 任务 @@ -709,24 +719,25 @@ Hugging Face ID \endhead \bottomrule\noalign{} \endlastfoot -文生图 & Stable Diffusion XL & stabilityai/stable-diffusion-xl-base-1.0 \\ +文生图 & Stable Diffusion XL & +stabilityai/stable-diffusion-xl-base-1.0 \\ 目标检测 & YOLOv8 & Ultralytics \\ 语义分割 & SAM & segment-anything \\ 大语言模型 & Llama 3 & meta-llama/Meta-Llama-3-8B \\ \end{longtable} } -\subsubsection{4 机器学习与深度学习入门教程} +\section{机器学习与深度学习入门教程} 本节通过一个完整的实践流程,带领读者从数据准备到模型训练,体验机器学习和深度学习的核心步骤。 -\paragraph{机器学习 vs 深度学习} +\subsubsection{机器学习 vs 深度学习} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4054}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3778}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1358}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4198}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4198}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 维度 @@ -747,15 +758,15 @@ Hugging Face ID \end{longtable} } -\paragraph{scikit-learn:机器学习实践}\label{scikit-learnux673aux5668ux5b66ux4e60ux5b9eux8df5} +\subsubsection{scikit-learn:机器学习实践} scikit-learn是Python最经典的机器学习库,提供了丰富的算法和工具。 -\subparagraph{安装} +\paragraph{安装} pip install scikit-learn -\subparagraph{完整示例:鸢尾花分类} +\paragraph{完整示例:鸢尾花分类} \textbf{import} numpy \textbf{as} np @@ -763,7 +774,8 @@ pip install scikit-learn \textbf{from} sklearn \textbf{import} datasets -\textbf{from} sklearn.model\_selection \textbf{import} train\_test\_split +\textbf{from} sklearn.model\_selection \textbf{import} +train\_test\_split \textbf{from} sklearn.preprocessing \textbf{import} StandardScaler @@ -773,9 +785,10 @@ pip install scikit-learn \textbf{from} sklearn.ensemble \textbf{import} RandomForestClassifier -\textbf{from} sklearn.metrics \textbf{import} accuracy\_score, classification\_report +\textbf{from} sklearn.metrics \textbf{import} accuracy\_score, +classification\_report -\paragraph{}\label{section-6} +\subsubsection{}\label{section} \emph{\# 1. 加载数据} @@ -787,22 +800,16 @@ y = iris.target \emph{\# 标签:三种鸢尾花} print(f"数据集大小: \{X.shape\}, 类别数: \{len(np.unique(y))\}") -\begin{verbatim} -\end{verbatim} - \emph{\# 2. 划分训练集和测试集} X\_train, X\_test, y\_train, y\_test = train\_test\_split( -\begin{verbatim} +\begin{lstlisting} X, y, test_size=0.3, random_state=42 -\end{verbatim} +\end{lstlisting} ) -\begin{verbatim} -\end{verbatim} - \emph{\# 3. 数据标准化} scaler = StandardScaler() @@ -811,9 +818,6 @@ X\_train = scaler.fit\_transform(X\_train) X\_test = scaler.transform(X\_test) -\begin{verbatim} -\end{verbatim} - \emph{\# 4. 训练多个模型并比较} models = \{ @@ -826,9 +830,9 @@ models = \{ "随机森林": RandomForestClassifier(n\_estimaors=100), \end{quote} -\begin{verbatim} +\begin{lstlisting} } -\end{verbatim} +\end{lstlisting} \textbf{for} name, model \textbf{in} models.items(): @@ -848,20 +852,21 @@ y\_pred = best\_model.predict(X\_test) print("\textbackslash n分类报告:") -\begin{verbatim} +\begin{lstlisting} print(classification_report(y_test, y_pred, target_names=iris.target_names)) -\end{verbatim} +\end{lstlisting} -\subparagraph{机器学习工作流总结} +\paragraph{机器学习工作流总结} 数据收集 → 数据预处理 → 特征工程 → 划分训练/测试集\\ → 选择模型 → 训练 → 评估 → 调优 → 部署 -\paragraph{PyTorch:深度学习实践}\label{pytorchux6df1ux5ea6ux5b66ux4e60ux5b9eux8df5} +\subsubsection{PyTorch:深度学习实践} -PyTorch是当前研究和实验中最流行的深度学习框架,以动态计算图和Pythonic API著称。 +PyTorch是当前研究和实验中最流行的深度学习框架,以动态计算图和Pythonic +API著称。 -\subparagraph{张量(Tensor)基础} +\paragraph{张量(Tensor)基础} 张量是PyTorch的核心数据结构,类似于NumPy数组,但可以在GPU上运算。 @@ -884,7 +889,7 @@ arr = np.array({[}1, 2, 3{]})\\ tensor = torch.from\_numpy(arr) \emph{\# NumPy → Tensor}\\ back = tensor.numpy() \emph{\# Tensor → NumPy} -\subparagraph{自动求导(Autograd)} +\paragraph{自动求导(Autograd)} PyTorch的autograd模块可以自动计算梯度,是训练神经网络的核心。 @@ -898,7 +903,7 @@ y = x ** 2 + 3 * x + 1 \emph{\# y = x² + 3x + 1}\\ y.backward()\\ print(f"dy/dx = \{x.grad\}") \emph{\# 应为 2x + 3 = 7(x=2时)} -\subparagraph{完整示例:手写数字识别} +\paragraph{完整示例:手写数字识别} 以下是一个完整的神经网络训练流程,使用经典的MNIST数据集。 @@ -910,33 +915,31 @@ print(f"dy/dx = \{x.grad\}") \emph{\# 应为 2x + 3 = 7(x=2时)} \textbf{from} torchvision \textbf{import} datasets, transforms -\subparagraph{}\label{section-7} +\paragraph{}\label{section-4} \emph{\# 1. 数据准备} transform = transforms.Compose({[} -\begin{verbatim} +\begin{lstlisting} transforms.ToTensor(), # 转为张量 -\end{verbatim} +\end{lstlisting} transforms.Normalize((0.1307,), (0.3081,)) \emph{\# 标准化} {]}) -train\_dataset = datasets.MNIST(\textquotesingle./data\textquotesingle, train=True, download=True, transform=transform) +train\_dataset = datasets.MNIST(\textquotesingle./data\textquotesingle, +train=True, download=True, transform=transform) -test\_dataset = datasets.MNIST(\textquotesingle./data\textquotesingle, train=False, transform=transform) +test\_dataset = datasets.MNIST(\textquotesingle./data\textquotesingle, +train=False, transform=transform) -\begin{verbatim} -\end{verbatim} +train\_loader = torch.utils.data.DataLoader(train\_dataset, +batch\_size=64, shuffle=True) -train\_loader = torch.utils.data.DataLoader(train\_dataset, batch\_size=64, shuffle=True) - -test\_loader = torch.utils.data.DataLoader(test\_dataset, batch\_size=1000) - -\begin{verbatim} -\end{verbatim} +test\_loader = torch.utils.data.DataLoader(test\_dataset, +batch\_size=1000) \emph{\# 2. 定义模型} @@ -952,42 +955,30 @@ self.fc2 = nn.Linear(128, 64) \emph{\# 隐藏层 → 隐藏层} self.fc3 = nn.Linear(64, 10) \emph{\# 隐藏层 → 输出层(10个数字)} -\begin{verbatim} -\end{verbatim} - \textbf{def} forward(self, x): -\begin{verbatim} +\begin{lstlisting} x = x.view(-1, 28 * 28) # 展平图像 -\end{verbatim} +\end{lstlisting} x = torch.relu(self.fc1(x)) \emph{\# ReLU激活} x = torch.relu(self.fc2(x)) -\begin{verbatim} +\begin{lstlisting} x = self.fc3(x) # 输出层不加激活 -\end{verbatim} +\end{lstlisting} \textbf{return} x -\begin{verbatim} -\end{verbatim} - model = Net() -\begin{verbatim} -\end{verbatim} - \emph{\# 3. 定义损失函数和优化器} criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) -\begin{verbatim} -\end{verbatim} - \emph{\# 4. 训练} \textbf{for} epoch \textbf{in} range(5): @@ -998,25 +989,26 @@ total\_loss = 0 \textbf{for} batch\_x, batch\_y \textbf{in} train\_loader: -\begin{verbatim} +\begin{lstlisting} optimizer.zero_grad() # 清零梯度 output = model(batch_x) # 前向传播 -\end{verbatim} +\end{lstlisting} loss = criterion(output, batch\_y) \emph{\# 计算损失} -\begin{verbatim} +\begin{lstlisting} loss.backward() # 反向传播 optimizer.step() # 更新参数 -\end{verbatim} +\end{lstlisting} total\_loss += loss.item() -print(f"Epoch \{epoch+1\}, Loss: \{total\_loss/len(train\_loader):.4f\}") +print(f"Epoch \{epoch+1\}, Loss: +\{total\_loss/len(train\_loader):.4f\}") -\begin{verbatim} +\begin{lstlisting} # 5. 测试 -\end{verbatim} +\end{lstlisting} model.eval() @@ -1036,12 +1028,11 @@ total += batch\_y.size(0) correct += (predicted == batch\_y).sum() -\begin{verbatim} - +\begin{lstlisting} print(f"\n测试准确率: {correct/total:.2%}") -\end{verbatim} +\end{lstlisting} -\paragraph{使用预训练模型} +\subsubsection{使用预训练模型} 在实际应用中,通常不需要从头训练模型,而是使用预训练模型进行微调或直接推理。 @@ -1055,37 +1046,32 @@ print(f"\n测试准确率: {correct/total:.2%}") classifier = pipeline("sentiment-analysis")\\ result = classifier("This design is amazing!")\\ print(result)\\ -\emph{\# {[}\{\textquotesingle label\textquotesingle: \textquotesingle POSITIVE\textquotesingle, \textquotesingle score\textquotesingle: 0.9998\}{]}}\\ +\emph{\# {[}\{\textquotesingle label\textquotesingle: +\textquotesingle POSITIVE\textquotesingle, +\textquotesingle score\textquotesingle: 0.9998\}{]}}\\ \strut \\ \emph{\# 图像分类}\\ image\_classifier = pipeline("image-classification")\\ result = image\_classifier("building.jpg")\\ print(result)\\ -\emph{\# {[}\{\textquotesingle score\textquotesingle: 0.92, \textquotesingle label\textquotesingle: \textquotesingle palace\textquotesingle\}, ...{]}} +\emph{\# {[}\{\textquotesingle score\textquotesingle: 0.92, +\textquotesingle label\textquotesingle: +\textquotesingle palace\textquotesingle\}, ...{]}} -\subparagraph{使用Ultralytics YOLO} +\paragraph{使用Ultralytics YOLO} \emph{\# 安装: pip install ultralytics} \textbf{from} ultralytics \textbf{import} YOLO -\begin{verbatim} -\end{verbatim} - \emph{\# 加载预训练模型} model = YOLO("yolov8n.pt") -\begin{verbatim} -\end{verbatim} - \emph{\# 目标检测} results = model("street\_photo.jpg") -\begin{verbatim} -\end{verbatim} - \emph{\# 查看结果} \textbf{for} result \textbf{in} results: @@ -1100,16 +1086,17 @@ conf = float(box.conf{[}0{]}) label = model.names{[}cls{]} -\begin{verbatim} +\begin{lstlisting} print(f"检测到: {label}, 置信度: {conf:.2f}") -\end{verbatim} +\end{lstlisting} -\paragraph{GPU加速}\label{gpuux52a0ux901f} +\subsubsection{GPU加速} 深度学习训练在GPU上可以快数十倍。PyTorch的GPU使用非常简洁: \emph{\# 检查GPU是否可用}\\ -device = torch.device("cuda" \textbf{if} torch.cuda.is\_available() \textbf{else} "cpu")\\ +device = torch.device("cuda" \textbf{if} torch.cuda.is\_available() +\textbf{else} "cpu")\\ print(f"使用设备: \{device\}")\\ \strut \\ \emph{\# 将模型和数据移动到GPU}\\ @@ -1121,15 +1108,17 @@ batch\_x = batch\_x.to(device)\\ batch\_y = batch\_y.to(device)\\ \emph{\# ... 后续训练代码不变} -在没有本地GPU的情况下,可以使用 \href{https://colab.research.google.com/}{Google Colab} 免费使用云端GPU运行上述代码。 +在没有本地GPU的情况下,可以使用 +\href{https://colab.research.google.com/}{Google Colab} +免费使用云端GPU运行上述代码。 -\paragraph{学习路径建议} +\subsubsection{学习路径建议} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1657}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3204}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2490}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1327}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2478}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.6018}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 阶段 @@ -1143,12 +1132,13 @@ batch\_y = batch\_y.to(device)\\ \bottomrule\noalign{} \endlastfoot 入门 & Python基础 + NumPy/Pandas & 本附录 §3 \\ -机器学习 & scikit-learn实践 & \href{https://scikit-learn.org/stable/tutorial/}{scikit-learn官方教程} \\ -深度学习基础 & PyTorch入门 + MLP & \href{https://pytorch.org/tutorials/}{PyTorch官方教程} \\ +机器学习 & scikit-learn实践 & +\href{https://scikit-learn.org/stable/tutorial/}{scikit-learn官方教程} \\ +深度学习基础 & PyTorch入门 + MLP & +\href{https://pytorch.org/tutorials/}{PyTorch官方教程} \\ 计算机视觉 & CNN + 图像分类/检测 & 本书第三篇 + CS231n \\ 自然语言处理 & Transformer + LLM & 本书第四篇 + CS224n \\ 生成式AI & Diffusion + AIGC工具 & 本书第五篇 \\ 前沿探索 & Agent + 具身智能 & 本书第六篇 \\ \end{longtable} } - diff --git a/appendices/ap02-vibe-coding.tex b/appendices/ap02-vibe-coding.tex index ec685d0..1fca14b 100644 --- a/appendices/ap02-vibe-coding.tex +++ b/appendices/ap02-vibe-coding.tex @@ -1,26 +1,29 @@ -\chapter{附录2:Vibe Coding与工具链} +\chapter{Vibe Coding与工具链} -本附录介绍Vibe Coding的概念与实践,以及VsCode、Claude Code、Markdown/Obsidian、Git/GitHub等核心工具的使用方法。 +本附录介绍Vibe Coding的概念与实践,以及VsCode、Claude +Code、Markdown/Obsidian、Git/GitHub等核心工具的使用方法。 -\subsubsection{Vibe Coding的概念与工具}\label{vibe-codingux7684ux6982ux5ff5ux4e0eux5de5ux5177} +\section{Vibe Coding的概念与工具} -\paragraph{什么是Vibe Coding} +\subsubsection{什么是Vibe Coding} 传统编程:\textbf{明确需求 → 设计算法 → 编写代码} Vibe Coding:\textbf{模糊想法 → AI辅助 → 迭代完善} -Vibe Coding是一种以AI为核心的编程新模式:开发者用自然语言描述意图,AI生成代码,再通过迭代对话逐步完善。对于编程经验较少的设计专业读者而言,这种模式大幅降低了技术门槛------不需要记住语法细节,只需要清楚地表达“想要什么”。 +Vibe +Coding是一种以AI为核心的编程新模式:开发者用自然语言描述意图,AI生成代码,再通过迭代对话逐步完善。对于编程经验较少的设计专业读者而言,这种模式大幅降低了技术门槛——不需要记住语法细节,只需要清楚地表达“想要什么”。 -\paragraph{工作流程} +\subsubsection{工作流程} \begin{enumerate} \def\labelenumi{\arabic{enumi}.} +\tightlist \item \textbf{描述意图}:用自然语言说明需求 \end{enumerate} -“帮我创建一个简单的图像分类模型” +``帮我创建一个简单的图像分类模型'' \begin{enumerate} \def\labelenumi{\arabic{enumi}.} @@ -33,21 +36,22 @@ Vibe Coding是一种以AI为核心的编程新模式:开发者用自然语言 \textbf{迭代优化}:通过对话逐步改进 \end{enumerate} -“把隐藏层改成128个神经元” +``把隐藏层改成128个神经元'' \begin{enumerate} \def\labelenumi{\arabic{enumi}.} \setcounter{enumi}{4} +\tightlist \item \textbf{理解学习}:阅读AI生成的代码,理解实现原理 \end{enumerate} -\paragraph{实践技巧} +\subsubsection{实践技巧} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.1184}} - >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.3905}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.1528}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.4583}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 技巧 @@ -65,14 +69,14 @@ Vibe Coding是一种以AI为核心的编程新模式:开发者用自然语言 \end{longtable} } -\paragraph{工具生态} +\subsubsection{工具生态} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1982}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1475}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2970}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2366}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2375}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1625}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3125}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2625}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 工具 @@ -95,13 +99,14 @@ Replit Agent & 在线平台 & 端到端开发 & 小型项目、学习实验 \\ \end{longtable} } -\subsubsection{Claude Code简介与使用}\label{claude-codeux7b80ux4ecbux4e0eux4f7fux7528} +\section{Claude Code简介与使用} -\paragraph{什么是Claude Code} +\subsubsection{什么是Claude Code} -Claude Code是Anthropic推出的命令行AI编程工具(CLI),能够直接在终端中理解项目上下文、读写文件、执行命令,实现端到端的AI辅助开发。它也提供VSCode扩展,可以在编辑器中无缝使用。 +Claude +Code是Anthropic推出的命令行AI编程工具(CLI),能够直接在终端中理解项目上下文、读写文件、执行命令,实现端到端的AI辅助开发。它也提供VSCode扩展,可以在编辑器中无缝使用。 -\paragraph{安装与配置} +\subsubsection{安装与配置} \emph{\# 安装(需要 Node.js 18+)}\\ npm install -g @anthropic-ai/claude-code\\ @@ -112,24 +117,29 @@ claude 启动后进入交互式对话界面,直接用自然语言描述需求即可。 -\paragraph{核心使用方式} +\subsubsection{核心使用方式} -\textbf{对话式开发}:用自然语言描述任务,Claude Code会自动读取相关文件、编写代码、执行测试。 +\textbf{对话式开发}:用自然语言描述任务,Claude +Code会自动读取相关文件、编写代码、执行测试。 -\textgreater{} 帮我创建一个数据预处理的Python脚本,读取CSV文件并清洗缺失值 +\textgreater{} +帮我创建一个数据预处理的Python脚本,读取CSV文件并清洗缺失值 -\textbf{文件操作}:Claude Code可以直接读取、创建和编辑项目中的文件,每次修改前会征得确认。 +\textbf{文件操作}:Claude +Code可以直接读取、创建和编辑项目中的文件,每次修改前会征得确认。 -\textbf{命令执行}:可以请求Claude Code运行终端命令,如安装依赖、运行脚本等。 +\textbf{命令执行}:可以请求Claude +Code运行终端命令,如安装依赖、运行脚本等。 -\paragraph{VSCode中的Claude Code}\label{vscodeux4e2dux7684claude-code} +\subsubsection{VSCode中的Claude +Code} Claude Code提供VSCode扩展,在编辑器中获得同样的AI辅助能力: \begin{enumerate} \def\labelenumi{\arabic{enumi}.} \item - 在VSCode扩展商店搜索 ``Claude Code'' 并安装 + 在VSCode扩展商店搜索 ``Claude Code“ 并安装 \item 打开项目文件夹 \item @@ -138,9 +148,10 @@ Claude Code提供VSCode扩展,在编辑器中获得同样的AI辅助能力: 在编辑器中选中代码后,可以直接向Claude提问或请求修改 \end{enumerate} -\textbf{常用场景}: - 选中一段代码,请求“解释这段代码” - 选中函数,请求“添加错误处理” - 在Claude面板中输入“帮我写单元测试” +\textbf{常用场景}: - 选中一段代码,请求”解释这段代码“ - +选中函数,请求”添加错误处理” - 在Claude面板中输入”帮我写单元测试” -\paragraph{典型项目工作流} +\subsubsection{典型项目工作流} \textbf{推荐项目结构}: @@ -154,7 +165,7 @@ project/\\ ├── requirements.txt \# 依赖列表\\ └── README.md \# 项目说明 -\subparagraph{开发流程:} +\paragraph{开发流程:} \emph{\# 1. 创建环境}\\ conda create -n myproject python=3.10\\ @@ -169,15 +180,15 @@ claude\\ \emph{\# 4. 保存环境}\\ conda env export \textgreater{} environment.yml -\subsubsection{Markdown语法及Obsidian工具}\label{markdownux8bedux6cd5ux53caobsidianux5de5ux5177} +\subsection{Markdown语法及Obsidian工具} -\paragraph{Markdown简介}\label{markdownux7b80ux4ecb} +\subsubsection{Markdown简介} Markdown是一种轻量级标记语言,用纯文本格式编写文档,可以方便地转换为HTML、PDF等格式。它的语法简洁直观,是技术文档、笔记、学术写作的常用工具。 本书全部内容即使用Markdown编写。 -\paragraph{基础语法} +\subsubsection{基础语法} \textbf{标题}: @@ -189,9 +200,13 @@ Markdown是一种轻量级标记语言,用纯文本格式编写文档,可以 \textbf{文本格式}: -*斜体* **加粗** ***粗斜体*** \textasciitilde\textasciitilde 删除线\textasciitilde\textasciitilde{} \textless{}\textbf{u}\textgreater 下划线\textless/\textbf{u}\textgreater{} \emph{\textbf{`行内代码`}} \textbf{==高亮文本==} \_\_\_分隔线 +*斜体* **加粗** ***粗斜体*** +\textasciitilde\textasciitilde 删除线\textasciitilde\textasciitilde{} +\textless{}\textbf{u}\textgreater 下划线\textless/\textbf{u}\textgreater{} +\textbf{\emph{`行内代码`}} \textbf{==高亮文本==} \_\_\_分隔线 -包含反引号的代码:当代码本身包含反引号时,使用两个反引号包围,使用 `code` 这样的格式 +包含反引号的代码:当代码本身包含反引号时,使用两个反引号包围,使用 +`code` 这样的格式 \textbf{列表}: 列表可以嵌套使用 @@ -201,50 +216,55 @@ Markdown是一种轻量级标记语言,用纯文本格式编写文档,可以 \begin{enumerate} \def\labelenumi{\arabic{enumi}.} +\tightlist \item 有序列表项1 \end{enumerate} -\begin{verbatim} +\begin{lstlisting} 2. 有序列表项2 -\end{verbatim} +\end{lstlisting} - {[} {]} 未完成的任务 -\begin{verbatim} +\begin{lstlisting} - [x] 已完成的任务 -\end{verbatim} +\end{lstlisting} \textbf{链接与图片}: -{[}链接文字{]}(https://example.com) \textless!-\/- 行内链接 -\/-\textgreater{}\\ +{[}链接文字{]}(https://example.com) \textless!-\/- 行内链接 +-\/-\textgreater{}\\ {[}链接文字{]}{[}1{]} \textless!-\/- 参考式链接 -\/-\textgreater{}\\ {[}跳转到基础{]}(\#基础) \textless!-\/- 锚点链接 -\/-\textgreater{}\\ \strut \\ -{[}1{]}: https://www.example.com \textless!-\/- 参考链接定义 -\/-\textgreater{}\\ +{[}1{]}: https://www.example.com \textless!-\/- 参考链接定义 +-\/-\textgreater{}\\ \strut \\ !{[}图片说明{]}(image.png) \textless!-\/- 基本图片 -\/-\textgreater{}\\ -*图7.8 路杀动物* \textless!-\/- 图片下方用斜体作为图注 -\/-\textgreater{}\\ +*图7.8 路杀动物* \textless!-\/- 图片下方用斜体作为图注 +-\/-\textgreater{}\\ \strut \\ \textless!-\/- 图片居中对齐并指定宽度 -\/-\textgreater{}\\ \textless div align="center"\textgreater{}\\ -\textless img src="image.png" alt="说明" style="width:10cm;"/\textgreater{}\\ +\textless img src="image.png" alt="说明" +style="width:10cm;"/\textgreater{}\\ \textless p\textgreater\textless em\textgreater 图片标题\textless/em\textgreater\textless/p\textgreater{}\\ \textless/div\textgreater{} \textbf{代码块}: -\emph{\textbf{```python}}\\ +\textbf{\emph{```python}}\\ print("Hello, World!")\\ -\emph{\textbf{```}} +\textbf{\emph{```}} 带行号的代码区块(需要渲染器支持,如 Docusaurus、VuePress): -\emph{\textbf{```javascript linenums="1"}}\\ -\emph{\textbf{function greet(name) \{}}\\ -\emph{\textbf{console.log(`Hello, \$\{name\}!{\kern0pt}`);}}\\ -\emph{\textbf{\}}}\\ -\emph{\textbf{```}} +\textbf{\emph{```javascript linenums="1"}}\\ +\textbf{\emph{function greet(name) \{}}\\ +\textbf{\emph{console.log(`Hello, \$\{name\}!{\kern0pt}`);}}\\ +\textbf{\emph{\}}}\\ +\textbf{\emph{```}} 表格: @@ -255,7 +275,8 @@ print("Hello, World!")\\ 对齐方式::-\/-\/- 左对齐,:-\/-\/-: 居中,-\/-\/-: 右对齐: \textbar{} 左对齐 \textbar{} 居中对齐 \textbar{} 右对齐 \textbar{}\\ -\textbar{} :-\/-\/-\/-\/- \textbar{} :-\/-\/-\/-\/-\/-: \textbar{} -\/-\/-\/-\/-: \textbar{}\\ +\textbar{} :-\/-\/-\/-\/- \textbar{} :-\/-\/-\/-\/-\/-: \textbar{} +-\/-\/-\/-\/-: \textbar{}\\ \textbar{} 内容 \textbar{} 内容 \textbar{} 100 \textbar{} \textbf{注记}: 输入后在Obsidian编辑器中会自动弹出添加注记模块 @@ -275,63 +296,63 @@ print("Hello, World!")\\ \textgreater{} - 了解项目背景和目标\\ \textgreater{} - 掌握核心功能特性 -\subparagraph{图表绘制(Mermaid):} +\paragraph{图表绘制(Mermaid):} 使用 ```mermaid 代码块,部分渲染器(GitHub、Typora、Obsidian)支持: 流程图: -\emph{\textbf{```mermaid}} +\textbf{\emph{```mermaid}} -\emph{\textbf{graph LR}} +\textbf{\emph{graph LR}} \begin{enumerate} \def\labelenumi{\Alph{enumi}.} \item - \emph{\textbf{{[}开始{]} -\/-\textgreater{} B\{条件判断\}}} + \textbf{\emph{{[}开始{]} -\/-\textgreater{} B\{条件判断\}}} \item - \emph{\textbf{-\/-\textgreater\textbar 是\textbar{} C{[}执行操作1{]}}} + \textbf{\emph{-\/-\textgreater\textbar 是\textbar{} C{[}执行操作1{]}}} \item - \emph{\textbf{-\/-\textgreater\textbar 否\textbar{} D{[}执行操作2{]}}} + \textbf{\emph{-\/-\textgreater\textbar 否\textbar{} D{[}执行操作2{]}}} \item - \emph{\textbf{-\/-\textgreater{} E{[}结束{]}}} + \textbf{\emph{-\/-\textgreater{} E{[}结束{]}}} \item - \emph{\textbf{-\/-\textgreater{} E}} + \textbf{\emph{-\/-\textgreater{} E}} \end{enumerate} -\emph{\textbf{```}} +\textbf{\emph{```}} 时序图: -\emph{\textbf{```mermaid}}\\ -\emph{\textbf{sequenceDiagram}}\\ -\emph{\textbf{participant 用户}}\\ -\emph{\textbf{participant 系统}}\\ -\emph{\textbf{用户-\textgreater\textgreater 系统: 登录请求}}\\ -\emph{\textbf{系统-\/-\textgreater\textgreater 用户: 返回结果}}\\ -\emph{\textbf{```}} +\textbf{\emph{```mermaid}}\\ +\textbf{\emph{sequenceDiagram}}\\ +\textbf{\emph{participant 用户}}\\ +\textbf{\emph{participant 系统}}\\ +\textbf{\emph{用户-\textgreater\textgreater 系统: 登录请求}}\\ +\textbf{\emph{系统-\/-\textgreater\textgreater 用户: 返回结果}}\\ +\textbf{\emph{```}} 甘特图: -\emph{\textbf{```mermaid}}\\ -\emph{\textbf{gantt}}\\ -\emph{\textbf{title 项目计划}}\\ -\emph{\textbf{dateFormat YYYY-MM-DD}}\\ -\emph{\textbf{section 设计}}\\ -\emph{\textbf{需求分析 :done, 2024-01-01, 15d}}\\ -\emph{\textbf{section 开发}}\\ -\emph{\textbf{编码实现 :active, 2024-01-16, 30d}}\\ -\emph{\textbf{```}} +\textbf{\emph{```mermaid}}\\ +\textbf{\emph{gantt}}\\ +\textbf{\emph{title 项目计划}}\\ +\textbf{\emph{dateFormat YYYY-MM-DD}}\\ +\textbf{\emph{section 设计}}\\ +\textbf{\emph{需求分析 :done, 2024-01-01, 15d}}\\ +\textbf{\emph{section 开发}}\\ +\textbf{\emph{编码实现 :active, 2024-01-16, 30d}}\\ +\textbf{\emph{```}} 饼图: -\emph{\textbf{```mermaid}}\\ -\emph{\textbf{pie}}\\ -\emph{\textbf{title 市场份额}}\\ -\emph{\textbf{"Chrome" : 65}}\\ -\emph{\textbf{"Safari" : 15}}\\ -\emph{\textbf{"其他" : 20}}\\ -\emph{\textbf{```}} +\textbf{\emph{```mermaid}}\\ +\textbf{\emph{pie}}\\ +\textbf{\emph{title 市场份额}}\\ +\textbf{\emph{"Chrome" : 65}}\\ +\textbf{\emph{"Safari" : 15}}\\ +\textbf{\emph{"其他" : 20}}\\ +\textbf{\emph{```}} \textbf{数学公式}: @@ -355,31 +376,43 @@ a & b \\ c & d \end{pmatrix}\] -\paragraph{Obsidian:Markdown笔记工具}\label{obsidianmarkdownux7b14ux8bb0ux5de5ux5177} +\subsubsection{Obsidian:Markdown笔记工具} -\href{https://obsidian.md/}{Obsidian} 是一款基于Markdown的知识管理工具,适合构建个人知识库和笔记系统。 +\href{https://obsidian.md/}{Obsidian} +是一款基于Markdown的知识管理工具,适合构建个人知识库和笔记系统。 -\textbf{核心特性}: - \textbf{本地存储}:所有笔记以Markdown文件保存在本地,数据完全自主 - \textbf{双向链接}:用 {[}{[}笔记名{]}{]} 在笔记之间建立链接,形成知识网络 - \textbf{图谱视图}:可视化笔记之间的关联关系 - \textbf{插件生态}:丰富的社区插件扩展功能(如日历、看板、模板等) - \textbf{实时预览}:编辑Markdown时实时渲染效果 +\textbf{核心特性}: - +\textbf{本地存储}:所有笔记以Markdown文件保存在本地,数据完全自主 - +\textbf{双向链接}:用 {[}{[}笔记名{]}{]} +在笔记之间建立链接,形成知识网络 - +\textbf{图谱视图}:可视化笔记之间的关联关系 - +\textbf{插件生态}:丰富的社区插件扩展功能(如日历、看板、模板等) - +\textbf{实时预览}:编辑Markdown时实时渲染效果 -\textbf{使用建议}: - 用Obsidian打开本教材的根目录,即可获得完整的阅读与编辑体验 - 建议安装“目录”插件,方便在长文档中快速导航 - 利用双向链接功能,将学习笔记与教材内容关联起来 +\textbf{使用建议}: - +用Obsidian打开本教材的根目录,即可获得完整的阅读与编辑体验 - +建议安装“目录”插件,方便在长文档中快速导航 - +利用双向链接功能,将学习笔记与教材内容关联起来 -\subsubsection{Git版本管理与GitHub协作}\label{gitux7248ux672cux7ba1ux7406ux4e0egithubux534fux4f5c} +\subsection{Git版本管理与GitHub协作} -\paragraph{为什么需要版本管理} +\subsubsection{为什么需要版本管理} -在项目开发过程中,文件会不断修改。版本管理工具可以: - 记录每一次修改的内容和时间 - 随时回退到之前的任意版本 - 多人协作时避免互相覆盖 +在项目开发过程中,文件会不断修改。版本管理工具可以: - +记录每一次修改的内容和时间 - 随时回退到之前的任意版本 - +多人协作时避免互相覆盖 Git是当前最流行的分布式版本管理系统。 -\paragraph{Git基础操作}\label{gitux57faux7840ux64cdux4f5c} +\subsubsection{Git基础操作} -\subparagraph{初始化仓库:} +\paragraph{初始化仓库:} \emph{\# 在项目目录中初始化Git}\\ cd my\_project\\ git init -\subparagraph{日常三步曲:} +\paragraph{日常三步曲:} \emph{\# 1. 查看当前修改状态}\\ git status\\ @@ -407,11 +440,15 @@ git log -\/- filename.md\\ \emph{\# 恢复某个文件到指定版本}\\ git checkout abc1234 -\/- filename.md -\paragraph{GitHub:云端协作平台}\label{githubux4e91ux7aefux534fux4f5cux5e73ux53f0} +\subsubsection{GitHub:云端协作平台} -\href{https://github.com/}{GitHub} 是基于Git的代码托管平台,提供云端存储和协作功能。 +\href{https://github.com/}{GitHub} +是基于Git的代码托管平台,提供云端存储和协作功能。 -\textbf{核心概念}: - \textbf{仓库(Repository)}:项目的存储空间,包含所有文件和历史记录 - \textbf{远程同步}:将本地仓库推送到GitHub,或从GitHub拉取更新 - \textbf{协作}:多人通过分支和合并协同工作 +\textbf{核心概念}: - +\textbf{仓库(Repository)}:项目的存储空间,包含所有文件和历史记录 - +\textbf{远程同步}:将本地仓库推送到GitHub,或从GitHub拉取更新 - +\textbf{协作}:多人通过分支和合并协同工作 \textbf{常用操作}: @@ -426,13 +463,13 @@ git pull \textbf{本书的Git管理}: -本书内容即通过Git进行版本管理。每个章节的修改都有完整的提交记录,可以通过 git log 查看内容的演变历史。 +本书内容即通过Git进行版本管理。每个章节的修改都有完整的提交记录,可以通过 +git log 查看内容的演变历史。 -\paragraph{推荐工作流} +\subsubsection{推荐工作流} 对于设计专业的学习和研究项目,建议采用以下简化工作流: 编写/修改文档 → git add → git commit → git push 每次完成一个阶段性工作(如写完一节内容、完成一次实验)后提交一次,附上简洁的说明。这样既保留了完整的历史记录,也不会因为误操作而丢失工作成果。 - diff --git a/appendices/ap03-academic-writing.tex b/appendices/ap03-academic-writing.tex index cff6ebd..6224501 100644 --- a/appendices/ap03-academic-writing.tex +++ b/appendices/ap03-academic-writing.tex @@ -1,16 +1,16 @@ -\chapter{附录3:学术论文撰写工作流} +\chapter{学术论文撰写工作流} 本附录介绍文献检索管理、论文写作工具、AI辅助写作流程及引用格式规范。 -\subsection{文献检索与管理} +\section{文献检索与管理} -\subsubsection{检索平台} +\subsection{检索平台} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1899}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1965}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2117}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1979}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1771}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.6042}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 平台 @@ -23,19 +23,21 @@ \endhead \bottomrule\noalign{} \endlastfoot -Google Scholar & 综合学术搜索 & \href{https://scholar.google.com/}{scholar.google.com} \\ +Google Scholar & 综合学术搜索 & +\href{https://scholar.google.com/}{scholar.google.com} \\ arXiv & AI领域预印本 & \href{https://arxiv.org/}{arxiv.org} \\ -Semantic Scholar & AI辅助文献搜索 & \href{https://www.semanticscholar.org/}{semanticscholar.org} \\ +Semantic Scholar & AI辅助文献搜索 & +\href{https://www.semanticscholar.org/}{semanticscholar.org} \\ CNKI & 中文学术文献 & \href{https://www.cnki.net/}{cnki.net} \\ \end{longtable} } -\subsubsection{文献管理工具} +\subsection{文献管理工具} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.1184}} - >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.3303}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.1528}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.4028}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 工具 @@ -52,20 +54,21 @@ EndNote & 功能全面、与Word深度集成 \\ \end{longtable} } -\subsection{论文写作工具} +\section{论文写作工具} -\subsubsection{LaTeX}\label{latex} +\subsection{LaTeX}\label{latex} 学术排版的行业标准,适合公式密集的论文。 \begin{itemize} \item - \textbf{在线编辑}:\href{https://www.overleaf.com/}{Overleaf} --- 无需本地安装,支持协作 + \textbf{在线编辑}:\href{https://www.overleaf.com/}{Overleaf} --- + 无需本地安装,支持协作 \item \textbf{本地编辑}:TeX Live + VSCode LaTeX Workshop 插件 \end{itemize} -\subsubsection{Markdown + Pandoc}\label{markdown-pandoc} +\subsection{Markdown + Pandoc}\label{markdown-pandoc} 轻量级写作方案,适合课程报告和技术文档。 @@ -73,12 +76,13 @@ EndNote & 功能全面、与Word深度集成 \\ pandoc paper.md -o paper.docx\\ pandoc paper.md -o paper.pdf -\/-pdf-engine=xelatex -\subsection{AI辅助写作流程}\label{aiux8f85ux52a9ux5199ux4f5cux6d41ux7a0b} +\section{AI辅助写作流程} \begin{enumerate} \def\labelenumi{\arabic{enumi}.} \item - \textbf{文献综述}:使用 ChatGPT/Claude 快速了解研究领域的核心文献和发展脉络 + \textbf{文献综述}:使用 ChatGPT/Claude + 快速了解研究领域的核心文献和发展脉络 \item \textbf{大纲生成}:通过AI辅助梳理论文结构和逻辑框架 \item @@ -89,9 +93,9 @@ pandoc paper.md -o paper.pdf -\/-pdf-engine=xelatex 注意:AI辅助写作应遵循学术诚信原则,AI生成的内容需人工审核和改写,核心观点和论证应由作者独立完成。 -\subsection{引用与格式规范} +\section{引用与格式规范} -\subsubsection{常用引用格式} +\subsection{常用引用格式} \begin{itemize} \item @@ -102,7 +106,7 @@ pandoc paper.md -o paper.pdf -\/-pdf-engine=xelatex \textbf{GB/T 7714}:中国国家标准 \end{itemize} -\subsubsection{BibTeX示例}\label{bibtexux793aux4f8b} +\subsection{BibTeX示例} @article\{vaswani2017attention,\\ title=\{Attention is all you need\},\\ @@ -111,4 +115,3 @@ journal=\{NeurIPS\},\\ volume=\{30\},\\ year=\{2017\}\\ \} - diff --git a/appendices/ap04-web-tools.tex b/appendices/ap04-web-tools.tex index 901c074..70eb99e 100644 --- a/appendices/ap04-web-tools.tex +++ b/appendices/ap04-web-tools.tex @@ -1,10 +1,10 @@ -\chapter{附录4:网络、网站与在线可视化} +\chapter{网络、网站与在线可视化} 本附录介绍网络基础知识、网站搭建入门,以及在线数据可视化的工具与方法。 -\subsection{网络基础知识} +\section{网络基础知识} -\subsubsection{互联网与Web} +\subsection{互联网与Web} 互联网(Internet)是由全球计算机互相连接而成的网络。Web(万维网)是运行在互联网上的信息系统,通过浏览器访问网页来获取信息。 @@ -12,8 +12,8 @@ {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.1617}} - >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.6553}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.1733}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.8000}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 概念 @@ -33,28 +33,31 @@ API & 应用程序接口,程序之间交换数据的标准方式 \\ \end{longtable} } -\subsubsection{前端与后端} +\subsection{前端与后端} 一个完整的Web应用由前端和后端两部分组成: 用户浏览器(前端) ←→ 服务器(后端) ←→ 数据库\\ HTML/CSS/JS Python/Node.js MySQL/PostgreSQL -\textbf{前端}:用户在浏览器中看到和操作的界面,使用 HTML、CSS、JavaScript 构建。 +\textbf{前端}:用户在浏览器中看到和操作的界面,使用 +HTML、CSS、JavaScript 构建。 -\textbf{后端}:运行在服务器上的程序,处理数据逻辑、存储和检索,可以用 Python(Flask/Django/FastAPI)、Node.js、Java 等实现。 +\textbf{后端}:运行在服务器上的程序,处理数据逻辑、存储和检索,可以用 +Python(Flask/Django/FastAPI)、Node.js、Java 等实现。 -\subsubsection{API与数据交互}\label{apiux4e0eux6570ux636eux4ea4ux4e92} +\subsection{API与数据交互} -API(Application Programming Interface)是程序之间通信的接口。在AI应用中,调用大语言模型、获取在线数据等操作都通过API完成。 +API(Application Programming +Interface)是程序之间通信的接口。在AI应用中,调用大语言模型、获取在线数据等操作都通过API完成。 \textbf{RESTful API 基本概念}: {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1134}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2835}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1250}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1528}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3472}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 方法 @@ -84,12 +87,15 @@ data = response.json() \emph{\# 将返回的JSON解析为Python字典}\\ print(data)\\ \strut \\ \emph{\# POST请求示例}\\ -payload = \{"prompt": "设计一个现代风格的客厅", "model": "stable-diffusion"\}\\ -response = requests.post("https://api.example.com/generate", json=payload) +payload = \{"prompt": "设计一个现代风格的客厅", "model": +"stable-diffusion"\}\\ +response = requests.post("https://api.example.com/generate", +json=payload) -\subsubsection{JSON数据格式}\label{jsonux6570ux636eux683cux5f0f} +\subsection{JSON数据格式} -JSON(JavaScript Object Notation)是Web上最常用的数据交换格式,几乎所有API都使用JSON传递数据。 +JSON(JavaScript Object +Notation)是Web上最常用的数据交换格式,几乎所有API都使用JSON传递数据。 \{\\ "model": "ResNet",\\ @@ -112,16 +118,16 @@ json\_str = json.dumps(data, indent=2)\\ \emph{\# JSON字符串 → Python字典}\\ parsed = json.loads(json\_str) -\subsection{网站搭建入门} +\section{网站搭建入门} -\subsubsection{静态网站与动态网站} +\subsection{静态网站与动态网站} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1187}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3546}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2633}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2366}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1222}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3444}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2556}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2556}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 类型 @@ -136,12 +142,14 @@ parsed = json.loads(json\_str) \endhead \bottomrule\noalign{} \endlastfoot -静态网站 & 页面内容固定,无需服务器处理 & HTML/CSS/JS & 作品集、项目文档 \\ -动态网站 & 内容根据请求动态生成 & 前端 + 后端 + 数据库 & 在线工具、数据平台 \\ +静态网站 & 页面内容固定,无需服务器处理 & HTML/CSS/JS & +作品集、项目文档 \\ +动态网站 & 内容根据请求动态生成 & 前端 + 后端 + 数据库 & +在线工具、数据平台 \\ \end{longtable} } -\subsubsection{静态网站快速搭建} +\subsection{静态网站快速搭建} 对于设计专业的学生,最实用的方式是使用静态网站生成器搭建项目展示或文档站点。 @@ -174,9 +182,9 @@ mkdocs build 即可通过 https://username.github.io/repo 访问 \end{enumerate} -\subsubsection{HTML/CSS/JavaScript 速览}\label{htmlcssjavascript-ux901fux89c8} +\section{HTML/CSS/JavaScript 速览} -\paragraph{HTML:页面结构}\label{htmlux9875ux9762ux7ed3ux6784} +\subsubsection{HTML:页面结构} \textless!DOCTYPE html\textgreater{}\\ \textless{}\textbf{html}\textgreater{}\\ @@ -187,11 +195,12 @@ mkdocs build \textless{}\textbf{h1}\textgreater 设计作品集\textless/\textbf{h1}\textgreater{}\\ \textless{}\textbf{p}\textgreater 欢迎来到我的作品展示页面\textless/\textbf{p}\textgreater{}\\ \textless{}\textbf{img} src="design.jpg" alt="设计作品"\textgreater{}\\ -\textless{}\textbf{a} href="https://example.com"\textgreater 了解更多\textless/\textbf{a}\textgreater{}\\ +\textless{}\textbf{a} +href="https://example.com"\textgreater 了解更多\textless/\textbf{a}\textgreater{}\\ \textless/\textbf{body}\textgreater{}\\ \textless/\textbf{html}\textgreater{} -\paragraph{CSS:页面样式}\label{cssux9875ux9762ux6837ux5f0f} +\subsubsection{CSS:页面样式} body \{\\ \textbf{font-family}: "Helvetica", sans-serif;\\ @@ -205,22 +214,23 @@ h1 \{\\ \textbf{text-align}: center;\\ \} -\paragraph{JavaScript:页面交互}\label{javascriptux9875ux9762ux4ea4ux4e92} +\subsubsection{JavaScript:页面交互} \emph{// 点击按钮时显示消息}\\ -document.getElementById("myButton").addEventListener("click", \textbf{function}() \{\\ +document.getElementById("myButton").addEventListener("click", +\textbf{function}() \{\\ alert("按钮被点击了!");\\ \}); -\subsubsection{前端框架简介} +\subsection{前端框架简介} 对于更复杂的Web应用,可以使用前端框架提升开发效率: {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1107}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3071}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3379}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1667}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3750}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4028}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 框架 @@ -245,36 +255,34 @@ Streamlit & Python编写Web应用 & AI模型展示、数据分析仪表板 \\ \begin{enumerate} \def\labelenumi{\arabic{enumi}.} +\tightlist \item title("图像分类演示") \end{enumerate} st.write("上传一张图片,AI将识别其中的内容") -\begin{verbatim} -\end{verbatim} - uploaded\_file = st.file\_uploader("选择图片", type={[}"jpg", "png"{]}) \textbf{if} uploaded\_file: st.image(uploaded\_file, caption="上传的图片") -\begin{verbatim} +\begin{lstlisting} st.write("分类结果:建筑(置信度 95%)") -\end{verbatim} +\end{lstlisting} \emph{\# 安装并运行}\\ pip install streamlit\\ streamlit run app.py -\subsubsection{网站部署方式} +\subsection{网站部署方式} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3137}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2835}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3889}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3472}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1528}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 方式 @@ -294,13 +302,13 @@ Hugging Face Spaces & 适合AI模型演示 & 免费额度 \\ \end{longtable} } -\subsection{在线数据可视化} +\section{在线数据可视化} -\subsubsection{为什么需要数据可视化} +\subsection{为什么需要数据可视化} 设计领域的AI研究和实践经常涉及数据展示:训练损失曲线、模型性能对比、空间数据分析结果等。数据可视化将抽象的数字转化为直观的图形,帮助理解和决策。 -\subsubsection{Python可视化库}\label{pythonux53efux89c6ux5316ux5e93} +\subsection{Python可视化库} Matplotlib:基础绑图 @@ -308,21 +316,27 @@ Matplotlib:基础绑图 \strut \\ \emph{\# 折线图}\\ epochs = range(1, 11)\\ -train\_loss = {[}0.9, 0.6, 0.4, 0.25, 0.15, 0.1, 0.07, 0.05, 0.04, 0.03{]}\\ -val\_loss = {[}0.85, 0.65, 0.45, 0.35, 0.28, 0.25, 0.24, 0.23, 0.23, 0.24{]}\\ +train\_loss = {[}0.9, 0.6, 0.4, 0.25, 0.15, 0.1, 0.07, 0.05, 0.04, +0.03{]}\\ +val\_loss = {[}0.85, 0.65, 0.45, 0.35, 0.28, 0.25, 0.24, 0.23, 0.23, +0.24{]}\\ \strut \\ plt.figure(figsize=(8, 5))\\ -plt.plot(epochs, train\_loss, \textquotesingle b-o\textquotesingle, label=\textquotesingle Train Loss\textquotesingle)\\ -plt.plot(epochs, val\_loss, \textquotesingle r-s\textquotesingle, label=\textquotesingle Val Loss\textquotesingle)\\ +plt.plot(epochs, train\_loss, \textquotesingle b-o\textquotesingle, +label=\textquotesingle Train Loss\textquotesingle)\\ +plt.plot(epochs, val\_loss, \textquotesingle r-s\textquotesingle, +label=\textquotesingle Val Loss\textquotesingle)\\ plt.xlabel(\textquotesingle Epoch\textquotesingle)\\ plt.ylabel(\textquotesingle Loss\textquotesingle)\\ -plt.title(\textquotesingle Training vs Validation Loss\textquotesingle)\\ +plt.title(\textquotesingle Training vs Validation +Loss\textquotesingle)\\ plt.legend()\\ plt.grid(True, alpha=0.3)\\ -plt.savefig(\textquotesingle loss\_comparison.png\textquotesingle, dpi=150, bbox\_inches=\textquotesingle tight\textquotesingle)\\ +plt.savefig(\textquotesingle loss\_comparison.png\textquotesingle, +dpi=150, bbox\_inches=\textquotesingle tight\textquotesingle)\\ plt.show() -\paragraph{Seaborn:统计可视化}\label{seabornux7edfux8ba1ux53efux89c6ux5316} +\subsubsection{Seaborn:统计可视化} 基于Matplotlib,提供更美观的统计图表。 @@ -333,11 +347,13 @@ plt.show() data = np.random.randn(10, 10)\\ corr = np.corrcoef(data)\\ \strut \\ -sns.heatmap(corr, annot=True, cmap=\textquotesingle coolwarm\textquotesingle)\\ -plt.title(\textquotesingle Feature Correlation Heatmap\textquotesingle)\\ +sns.heatmap(corr, annot=True, +cmap=\textquotesingle coolwarm\textquotesingle)\\ +plt.title(\textquotesingle Feature Correlation +Heatmap\textquotesingle)\\ plt.savefig(\textquotesingle heatmap.png\textquotesingle, dpi=150) -\paragraph{Plotly:交互式可视化}\label{plotlyux4ea4ux4e92ux5f0fux53efux89c6ux5316} +\subsubsection{Plotly:交互式可视化} 支持鼠标悬停、缩放、导出等交互操作,适合Web展示。 @@ -351,15 +367,15 @@ title="Iris Dataset Scatter Plot")\\ fig.write\_html("scatter.html") \emph{\# 导出为网页}\\ fig.show() -\subsubsection{在线可视化工具} +\subsection{在线可视化工具} 无需编程,通过网页界面即可创建可视化: {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1646}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3405}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2036}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1667}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3039}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.5098}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 工具 @@ -372,23 +388,28 @@ fig.show() \endhead \bottomrule\noalign{} \endlastfoot -Observable & JavaScript驱动的交互式笔记本 & \href{https://observablehq.com/}{observablehq.com} \\ -Flourish & 拖拽式数据可视化,模板丰富 & \href{https://flourish.studio/}{flourish.studio} \\ -Datawrapper & 适合制作新闻级图表 & \href{https://www.datawrapper.de/}{datawrapper.de} \\ -Tableau Public & 强大的商业智能可视化 & \href{https://public.tableau.com/}{public.tableau.com} \\ -ECharts & 百度开源的交互式图表库 & \href{https://echarts.apache.org/}{echarts.apache.org} \\ +Observable & JavaScript驱动的交互式笔记本 & +\href{https://observablehq.com/}{observablehq.com} \\ +Flourish & 拖拽式数据可视化,模板丰富 & +\href{https://flourish.studio/}{flourish.studio} \\ +Datawrapper & 适合制作新闻级图表 & +\href{https://www.datawrapper.de/}{datawrapper.de} \\ +Tableau Public & 强大的商业智能可视化 & +\href{https://public.tableau.com/}{public.tableau.com} \\ +ECharts & 百度开源的交互式图表库 & +\href{https://echarts.apache.org/}{echarts.apache.org} \\ \end{longtable} } -\subsubsection{地理空间可视化} +\subsection{地理空间可视化} 设计领域经常涉及地理和空间数据的可视化: {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1113}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3837}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2364}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1667}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4583}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2917}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 工具 @@ -425,12 +446,12 @@ icon=folium.Icon(color="blue", icon="info-sign")\\ \emph{\# 保存为网页}\\ m.save("map.html") -\subsubsection{可视化设计原则} +\subsection{可视化设计原则} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.2361}} - >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.6363}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.2838}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.6892}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 原则 @@ -448,4 +469,3 @@ m.save("map.html") 交互增强 & 在线可视化支持筛选、缩放、悬停查看详情 \\ \end{longtable} } - diff --git a/appendices/ap05-online-resources.tex b/appendices/ap05-online-resources.tex index dc9162c..9a48421 100644 --- a/appendices/ap05-online-resources.tex +++ b/appendices/ap05-online-resources.tex @@ -1,14 +1,14 @@ -\chapter{附录5:在线学习资源} +\chapter{在线学习资源} 本附录整理AI学习过程中常用的在线课程、技术博客与文档、以及公开数据集。 -\subsection{推荐课程} +\section{推荐课程} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2921}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1101}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2141}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2182}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1000}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.6636}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 名称 @@ -21,21 +21,27 @@ \endhead \bottomrule\noalign{} \endlastfoot -CS231n:计算机视觉 & Stanford & \href{http://cs231n.stanford.edu/}{cs231n.stanford.edu} \\ -Fast.ai:实用深度学习 & fast.ai & \href{https://course.fast.ai/}{course.fast.ai} \\ -吴恩达深度学习专项课 & Coursera & \href{https://www.coursera.org/specializations/deep-learning}{coursera.org} \\ -CS224n:NLP与深度学习 & Stanford & \href{https://web.stanford.edu/class/cs224n/}{web.stanford.edu} \\ -李宏毅机器学习 & YouTube & \href{https://www.youtube.com/c/HungyiLeeNTU}{youtube.com} \\ +CS231n:计算机视觉 & Stanford & +\href{http://cs231n.stanford.edu/}{cs231n.stanford.edu} \\ +Fast.ai:实用深度学习 & fast.ai & +\href{https://course.fast.ai/}{course.fast.ai} \\ +吴恩达深度学习专项课 & Coursera & +\href{https://www.coursera.org/specializations/deep-learning}{coursera.org} \\ +CS224n:NLP与深度学习 & Stanford & +\href{https://web.stanford.edu/class/cs224n/}{web.stanford.edu} \\ +李宏毅机器学习 & YouTube & +\href{https://www.youtube.com/c/HungyiLeeNTU}{youtube.com} \\ \end{longtable} } -\subsection{博客与文档} +\section{博客与文档} \begin{itemize} \item \href{https://lilianweng.github.io/}{Lil'Log} - AI深度技术文章 \item - \href{https://jalammar.github.io/illustrated-transformer/}{The Illustrated Transformer} - 可视化原理解析 + \href{https://jalammar.github.io/illustrated-transformer/}{The + Illustrated Transformer} - 可视化原理解析 \item \href{https://distill.pub/}{Distill.pub} - 交互式可视化论文 \item @@ -46,13 +52,13 @@ CS224n:NLP与深度学习 & Stanford & \href{https://web.stanford.edu/class/cs \href{https://python.langchain.com/}{LangChain文档} \end{itemize} -\subsection{数据集} +\section{数据集} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1735}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1185}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1987}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1928}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1325}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.6506}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 数据集 @@ -65,10 +71,12 @@ CS224n:NLP与深度学习 & Stanford & \href{https://web.stanford.edu/class/cs \endhead \bottomrule\noalign{} \endlastfoot -ImageNet & 图像分类 & \href{https://www.image-net.org/}{image-net.org} \\ +ImageNet & 图像分类 & +\href{https://www.image-net.org/}{image-net.org} \\ COCO & 目标检测 & \href{https://cocodataset.org/}{cocodataset.org} \\ -MNIST & 手写数字 & \href{http://yann.lecun.com/exdb/mnist/}{yann.lecun.com} \\ -OpenStreetMap & 地图数据 & \href{https://www.openstreetmap.org/}{openstreetmap.org} \\ +MNIST & 手写数字 & +\href{http://yann.lecun.com/exdb/mnist/}{yann.lecun.com} \\ +OpenStreetMap & 地图数据 & +\href{https://www.openstreetmap.org/}{openstreetmap.org} \\ \end{longtable} } - diff --git a/appendices/ap06-more-resources.tex b/appendices/ap06-more-resources.tex index 1a0eb80..e243dde 100644 --- a/appendices/ap06-more-resources.tex +++ b/appendices/ap06-more-resources.tex @@ -1,10 +1,10 @@ -\chapter{附录6:其他资源} +\chapter{其他资源} 本附录整理AIGC工具、设计领域AI工具,以及设计AI相关的学术期刊与会议。 -\subsection{AIGC工具}\label{aigcux5de5ux5177} +\section{AIGC工具} -\subsubsection{Stable Diffusion}\label{stable-diffusion} +\subsection{Stable Diffusion}\label{stable-diffusion} \textbf{WebUI}:\href{https://github.com/AUTOMATIC1111/stable-diffusion-webui}{Automatic1111} @@ -14,20 +14,23 @@ \textbf{from} diffusers \textbf{import} StableDiffusionPipeline\\ \strut \\ -pipe = StableDiffusionPipeline.from\_pretrained("runwayml/stable-diffusion-v1-5")\\ -image = pipe("a photo of an astronaut riding a horse on mars").images{[}0{]} +pipe = +StableDiffusionPipeline.from\_pretrained("runwayml/stable-diffusion-v1-5")\\ +image = pipe("a photo of an astronaut riding a horse on +mars").images{[}0{]} -\subsubsection{Midjourney}\label{midjourney} +\subsection{Midjourney}\label{midjourney} -\textbf{平台}:Discord \textbf{文档}:\href{https://docs.midjourney.com/}{docs.midjourney.com} +\textbf{平台}:Discord +\textbf{文档}:\href{https://docs.midjourney.com/}{docs.midjourney.com} -\subsection{设计领域AI工具} +\section{设计领域AI工具} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1790}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2364}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1779}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2111}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2333}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.5333}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 工具 @@ -40,18 +43,23 @@ image = pipe("a photo of an astronaut riding a horse on mars").images{[}0{]} \endhead \bottomrule\noalign{} \endlastfoot -Midjourney & 图像生成与创意探索 & \href{https://www.midjourney.com/}{midjourney.com} \\ -Stable Diffusion & 本地可控图像生成 & \href{https://stability.ai/}{stability.ai} \\ -ControlNet & 精确结构控制 & \href{https://arxiv.org/abs/2302.05543}{arxiv.org} \\ +Midjourney & 图像生成与创意探索 & +\href{https://www.midjourney.com/}{midjourney.com} \\ +Stable Diffusion & 本地可控图像生成 & +\href{https://stability.ai/}{stability.ai} \\ +ControlNet & 精确结构控制 & +\href{https://arxiv.org/abs/2302.05543}{arxiv.org} \\ Figma AI & 界面设计辅助 & \href{https://www.figma.com/}{figma.com} \\ -Galileo AI & 界面布局生成 & \href{https://www.usegalileo.ai/}{usegalileo.ai} \\ -Planner 5D & 室内设计自动生成 & \href{https://planner5d.com/}{planner5d.com} \\ +Galileo AI & 界面布局生成 & +\href{https://www.usegalileo.ai/}{usegalileo.ai} \\ +Planner 5D & 室内设计自动生成 & +\href{https://planner5d.com/}{planner5d.com} \\ \end{longtable} } -\subsection{学术期刊与会议} +\section{学术期刊与会议} -\subsubsection{设计AI相关期刊} +\subsection{设计AI相关期刊} \begin{itemize} \item @@ -62,7 +70,7 @@ Planner 5D & 室内设计自动生成 & \href{https://planner5d.com/}{planner5d. Automation in Construction \end{itemize} -\subsubsection{设计AI相关会议} +\subsection{设计AI相关会议} \begin{itemize} \item @@ -72,4 +80,3 @@ Planner 5D & 室内设计自动生成 & \href{https://planner5d.com/}{planner5d. \item eCAADe \end{itemize} - diff --git a/appendices/ap07-references.tex b/appendices/ap07-references.tex index 4f2fb3e..c681d6b 100644 --- a/appendices/ap07-references.tex +++ b/appendices/ap07-references.tex @@ -1,4 +1,3 @@ -\chapter{附录7:参考文献} +\chapter{参考文献} 本部分整理教材中引用的论文、书籍和在线资源。 - diff --git a/appendices/ap08-glossary.tex b/appendices/ap08-glossary.tex index 89c0075..904a270 100644 --- a/appendices/ap08-glossary.tex +++ b/appendices/ap08-glossary.tex @@ -1,14 +1,14 @@ -\chapter{附录8:关键术语表} +\chapter{关键术语表} 本附录按章节整理书中涉及的关键中英文术语。 -\subsection{第二章} +\section{第二章} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1635}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2921}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.5444}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1597}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2605}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.5630}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 中文 @@ -23,7 +23,8 @@ \endlastfoot 数据模态 & Data Modality & 信息的存在形式,如文本、图像、三维等 \\ 线性回归 & Linear Regression & \(y = ax + b\) 形式的函数拟合 \\ -多元回归 & Multiple Regression & 多输入变量的线性模型 \(y = \sum a_{i}x_{i} + b\) \\ +多元回归 & Multiple Regression & 多输入变量的线性模型 +\(y = \sum a_{i}x_{i} + b\) \\ 多层感知机 & Multi-Layer Perceptron (MLP) & 最基础的前馈神经网络结构 \\ 前向传播 & Forward Propagation & 数据从输入层到输出层的计算过程 \\ 激活函数 & Activation Function & 引入非线性的函数,如ReLU、Sigmoid \\ @@ -37,12 +38,15 @@ 迁移学习 & Transfer Learning & 将一个任务学到的知识迁移到新任务 \\ 基础模型 & Foundation Model & 在大规模数据上预训练的大型通用模型 \\ 涌现能力 & Emergent Abilities & 模型规模大到一定程度后出现的新能力 \\ -缩放定律 & Scaling Law & 模型性能与规模(数据量、参数量、计算量)之间的关系规律 \\ -环境-智能体-任务 & Environment-Agent-Task & AI实践的三元框架:环境提供操作空间,智能体执行任务,任务定义目标 \\ -Vibe Coding & Vibe Coding & 感觉驱动编程,用自然语言描述需求让AI生成代码的编程范式 \\ -全连接层 & Fully Connected Layer & 每个神经元与上一层所有神经元相连的网络层 \\ +缩放定律 & Scaling Law & +模型性能与规模(数据量、参数量、计算量)之间的关系规律 \\ +环境-智能体-任务 & Environment-Agent-Task & +AI实践的三元框架:环境提供操作空间,智能体执行任务,任务定义目标 \\ +Vibe Coding & Vibe Coding & +感觉驱动编程,用自然语言描述需求让AI生成代码的编程范式 \\ +全连接层 & Fully Connected Layer & +每个神经元与上一层所有神经元相连的网络层 \\ 预训练 & Pre-training & 在大规模数据上的初始训练阶段 \\ 微调 & Fine-tuning & 在特定任务数据上对预训练模型进行适配训练 \\ \end{longtable} } - diff --git a/appendices/ap09-tips.tex b/appendices/ap09-tips.tex index 717b5da..cc2b55a 100644 --- a/appendices/ap09-tips.tex +++ b/appendices/ap09-tips.tex @@ -1,8 +1,9 @@ -\chapter{附录9:Tips} +\chapter{Tips} \begin{itemize} \item - 用AI学习AI,大大减少了学习的时间和难度:例如markdown等语法,只需要学习两部分内容:1)掌握经常性的手动输入需要的内容,例如\#,- 等,2)了解剩余的语法的大致机制,例如图片插入可以使用html语法,公式排版使用的是Latex语法,具体实现时让AI撰写。 + 用AI学习AI,大大减少了学习的时间和难度:例如markdown等语法,只需要学习两部分内容:1)掌握经常性的手动输入需要的内容,例如\#,- + 等,2)了解剩余的语法的大致机制,例如图片插入可以使用html语法,公式排版使用的是Latex语法,具体实现时让AI撰写。 \item 有任何不懂的问题,直接问AI,如Claude code等CLI Agent以及在线等的大模型 \end{itemize} diff --git a/chapters/ch01-intro.tex b/chapters/ch01-intro.tex index 27ef87e..f537efb 100644 --- a/chapters/ch01-intro.tex +++ b/chapters/ch01-intro.tex @@ -3,9 +3,10 @@ 本章建立读者对人工智能的宏观认知框架。从 AI 的发展历程出发,回顾从早期符号主义到深度学习、再到大模型时代的关键技术突破与转折节点;进而梳理 AI 的范式演进,从感知智能到生成式智能、从单一任务到通用智能的发展脉络,帮助读者理解 AI 技术的全貌和未来趋势。 -\section{篇章导读} +\section*{篇章导读} +\addcontentsline{toc}{section}{篇章导读} -人工智能正在深刻改变设计的边界。从自动绘图到智能生成,从数据分析到自主决策,AI 技术为设计领域带来了前所未有的可能性。 +人工智能正在深刻改变设计的边界。从自动绘图到智能生成,从数据分析到自主决策,AI 技术为设计领域带来了前所未有的可能性——同时也带来了前所未有的困惑。 本篇将回答两个核心问题: @@ -20,36 +21,34 @@ 通过本篇学习,你将建立对 AI 的宏观认知,理解技术发展的脉络,为后续深入学习打下基础。 -\section{学习目标} +\section*{学习目标} +\addcontentsline{toc}{section}{学习目标} \begin{itemize} \tightlist -\item - 了解 AI 技术发展的关键时间节点 -\item - 理解 AI 四大赛道及其应用场景 -\item - 掌握设计领域 AI 应用的现状与趋势 -\item - 理解 AI 范式的三次演进 -\item - 掌握万能逼近定理的直观意义 -\item - 建立神经网络技术栈的完整认知 -\item - 理解 Scaling Law 与模型规模效应 +\item 了解 AI 技术发展的关键时间节点 +\item 理解 AI 四大赛道及其应用场景 +\item 掌握设计领域 AI 应用的现状与趋势 +\item 理解 AI 范式的三次演进 +\item 掌握万能逼近定理的直观意义 +\item 建立神经网络技术栈的完整认知 +\item 理解 Scaling Law 与模型规模效应 \end{itemize} -\section{第一部分:AI 与设计的交汇} +%% ============================================================ +%% 第一部分:AI 与设计的交汇 +%% ============================================================ -\section{案例引入:Amazon Go} +\section{AI 与设计的交汇} -\subsection{案例背景} +\subsection{案例引入:Amazon Go} -Amazon Go 是亚马逊推出的无人便利店,通过计算机视觉和传感器融合技术,实现“拿了就走”的购物体验。这一案例展示了多种 AI 技术如何协同工作,共同重构一个完整的线下场景。 +\subsubsection{案例背景} -\subsection{技术要素} +Amazon Go 是亚马逊推出的无人便利店,通过计算机视觉和传感器融合技术,实现"拿了就走"的购物体验。这一案例展示了多种 AI 技术如何协同工作,重构一个完整的线下场景。 + +\subsubsection{技术要素} Amazon Go 的 AI 技术栈融合了多项前沿技术: @@ -68,49 +67,55 @@ Amazon Go 的 AI 技术栈融合了多项前沿技术: \end{longtable} } -\subsection{启示} +\subsubsection{启示} -Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到“拿了就走”,AI 让交互变得更加自然。这个案例也说明,设计领域中许多看似复杂的环境感知与交互问题,都可以通过多技术的组合来加以解决。 +Amazon Go 展示了 AI 技术如何重构传统场景。从"扫码支付"到"拿了就走",AI 让交互变得更加自然。这个案例也说明,设计领域中许多看似复杂的环境感知与交互问题,都可以通过多技术的组合来加以解决。 -\section{AI 发展时间线(2016--2024)} +\subsection{AI 发展时间线} -\subsection{第一阶段:觉醒期(2016--2018)} +\subsubsection{萌芽期(1950s--2015)} + +在深度学习爆发之前,AI 经历了漫长的探索期,积累了关键的理论基础: \begin{itemize} \tightlist -\item - \textbf{2016}:AlphaGo 击败李世石,AI 进入公众视野 -\item - \textbf{2017}:Transformer 架构诞生,为大模型时代奠基 -\item - \textbf{2018}:BERT 预训练模型问世,NLP 任务取得突破 +\item \textbf{1956}:达特茅斯会议,"人工智能"概念正式诞生 +\item \textbf{1986}:反向传播算法(Backpropagation)被广泛应用,成为训练神经网络的核心方法 +\item \textbf{1997}:Deep Blue 击败国际象棋世界冠军卡斯帕罗夫 +\item \textbf{2012}:AlexNet 在 ImageNet 竞赛中大幅领先,深度学习时代开启 \end{itemize} -\subsection{第二阶段:爆发期(2019--2022)} +这段历史告诉我们:AI 并非一夜之间爆发,而是几十年理论沉淀与技术迭代的结果。 + +\subsubsection{觉醒期(2016--2018)} \begin{itemize} \tightlist -\item - \textbf{2019}:GPT-2 展示强大的文本生成能力 -\item - \textbf{2020}:GPT-3 发布,少样本学习能力震惊业界 -\item - \textbf{2022}:ChatGPT 发布,AI 对话能力达到新高度 +\item \textbf{2016}:AlphaGo 击败李世石,AI 进入公众视野 +\item \textbf{2017}:Transformer 架构诞生,为大模型时代奠基 +\item \textbf{2018}:BERT 预训练模型问世,NLP 任务取得突破 \end{itemize} -\subsection{第三阶段:应用期(2023--2024)} +\subsubsection{爆发期(2019--2022)} \begin{itemize} \tightlist -\item - \textbf{2023}:多模态大模型、AI Agent 概念兴起 -\item - \textbf{2024}:具身智能、端侧 AI 加速落地 +\item \textbf{2019}:GPT-2 展示强大的文本生成能力 +\item \textbf{2020}:GPT-3 发布,少样本学习能力震惊业界 +\item \textbf{2022}:ChatGPT 发布,AI 对话能力达到新高度 \end{itemize} -\section{AI 四大赛道} +\subsubsection{应用期(2023--2024)} -\subsection{AIGC(AI-Generated Content)}\label{aigcai-generated-content} +\begin{itemize} +\tightlist +\item \textbf{2023}:多模态大模型、AI Agent 概念兴起 +\item \textbf{2024}:具身智能、端侧 AI 加速落地 +\end{itemize} + +\subsection{AI 四大赛道} + +\subsubsection{AIGC(AI-Generated Content)}\label{aigcai-generated-content} \textbf{定义}:人工智能生成内容 @@ -118,19 +123,15 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到 \begin{itemize} \tightlist -\item - 文本生成:文章、报告、代码 -\item - 图像生成:设计稿、效果图、图标 -\item - 视频生成:短视频、动画、特效 -\item - 音频生成:音乐、配音、音效 +\item 文本生成:文章、报告、代码 +\item 图像生成:设计稿、效果图、图标 +\item 视频生成:短视频、动画、特效 +\item 音频生成:音乐、配音、音效 \end{itemize} -\textbf{设计影响}:从“工具辅助”到“生成伙伴” +\textbf{设计影响}:从"工具辅助"到"生成伙伴" -\subsection{Agent(智能体)} +\subsubsection{Agent(智能体)} \textbf{定义}:能够自主感知、规划、执行的系统 @@ -138,19 +139,15 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到 \begin{itemize} \tightlist -\item - \textbf{感知(Perception)}:理解环境信息 -\item - \textbf{规划(Planning)}:制定行动方案 -\item - \textbf{记忆(Memory)}:存储和检索经验 -\item - \textbf{工具(Tool Use)}:调用外部资源 +\item \textbf{感知(Perception)}:理解环境信息 +\item \textbf{规划(Planning)}:制定行动方案 +\item \textbf{记忆(Memory)}:存储和检索经验 +\item \textbf{工具(Tool Use)}:调用外部资源 \end{itemize} -\textbf{设计影响}:从“被动执行”到“主动协作” +\textbf{设计影响}:从"被动执行"到"主动协作" -\subsection{AI4S(AI for Science)}\label{ai4sai-for-science} +\subsubsection{AI4S(AI for Science)}\label{ai4sai-for-science} \textbf{定义}:AI 驱动科学发现 @@ -158,19 +155,15 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到 \begin{itemize} \tightlist -\item - 蛋白质结构预测(AlphaFold) -\item - 材料科学计算 -\item - 气候变化模拟 -\item - 城市系统优化 +\item 蛋白质结构预测(AlphaFold) +\item 材料科学计算 +\item 气候变化模拟 +\item 城市系统优化 \end{itemize} \textbf{设计影响}:数据驱动的设计决策 -\subsection{AIED(AI in Education)}\label{aiedai-in-education} +\subsubsection{AIED(AI in Education)}\label{aiedai-in-education} \textbf{定义}:AI 在教育领域的应用 @@ -178,21 +171,17 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到 \begin{itemize} \tightlist -\item - 个性化学习路径 -\item - 智能答疑与辅导 -\item - 学习行为分析 -\item - 知识图谱构建 +\item 个性化学习路径 +\item 智能答疑与辅导 +\item 学习行为分析 +\item 知识图谱构建 \end{itemize} \textbf{设计影响}:设计教育与人才培养模式变革 -\section{设计领域 AI 应用趋势} +\subsection{设计领域 AI 应用趋势} -\subsection{当前应用} +\subsubsection{当前应用} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{}lll@{}} @@ -210,38 +199,26 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到 \end{longtable} } -\subsection{未来趋势} +\subsubsection{未来趋势} \begin{enumerate} \def\labelenumi{\arabic{enumi}.} \tightlist -\item - \textbf{从单点工具到系统化解决方案} -\item - \textbf{从生成内容到生成决策} -\item - \textbf{从人机协作到人机共生} -\end{enumerate} - -\section{思考与练习} - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\tightlist -\item - 选择你熟悉的设计领域,分析 AI 在该领域的应用现状和潜力。 -\item - 思考 AI 四大赛道中,哪一个对你的专业影响最大?为什么? -\item - Amazon Go 案例中,哪些 AI 技术可以迁移到设计领域? +\item \textbf{从单点工具到系统化解决方案} +\item \textbf{从生成内容到生成决策} +\item \textbf{从人机协作到人机共生} \end{enumerate} -\section{第二部分:AI 范式演进} +%% ============================================================ +%% 第二部分:AI 范式演进 +%% ============================================================ -\section{AI 范式的三次演进} +\section{AI 范式演进} -\subsection{第一范式:规则系统(Symbolic AI)} +\subsection{三次范式演进} + +\subsubsection{第一范式:规则系统(Symbolic AI)} \textbf{时期}:1950s -- 1980s @@ -251,17 +228,14 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到 \begin{itemize} \tightlist -\item - 逻辑推理清晰 -\item - 知识表达明确 -\item - 泛化能力弱 +\item 逻辑推理清晰 +\item 知识表达明确 +\item 泛化能力弱 \end{itemize} \textbf{典型应用}:专家系统、棋类游戏 -\subsection{第二范式:机器学习(Machine Learning)} +\subsubsection{第二范式:机器学习(Machine Learning)} \textbf{时期}:1990s -- 2010s @@ -271,17 +245,14 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到 \begin{itemize} \tightlist -\item - 数据驱动 -\item - 特征工程依赖专家经验 -\item - 任务特定 +\item 数据驱动 +\item 特征工程依赖专家经验 +\item 任务特定 \end{itemize} \textbf{典型应用}:推荐系统、图像分类、语音识别 -\subsection{第三范式:深度学习(Deep Learning)} +\subsubsection{第三范式:深度学习(Deep Learning)} \textbf{时期}:2012 -- 至今 @@ -291,43 +262,36 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到 \begin{itemize} \tightlist -\item - 大数据驱动 -\item - 自动特征学习 -\item - 迁移学习能力强 +\item 大数据驱动 +\item 自动特征学习 +\item 迁移学习能力强 \end{itemize} \textbf{典型应用}:大语言模型、生成式 AI、自动驾驶 -\section{万能逼近定理} +\subsection{万能逼近定理} -\subsection{定理表述} +\subsubsection{定理表述} \textbf{Universal Approximation Theorem(1989)}:一个具有足够多神经元的单隐藏层前馈神经网络,可以以任意精度逼近任何连续函数。 -\subsection{直观理解} +\subsubsection{直观理解} 想象一张橡皮膜: \begin{itemize} \tightlist -\item - 输入空间是平面上的点 -\item - 神经网络调整膜的形状 -\item - 神经元越多,膜的形变能力越强 -\item - 最终可以拟合任意复杂的曲面 +\item 输入空间是平面上的点 +\item 神经网络调整膜的形状 +\item 神经元越多,膜的形变能力越强 +\item 最终可以拟合任意复杂的曲面 \end{itemize} -\subsection{启示} +\subsubsection{启示} 这个定理告诉我们:\textbf{神经网络具有强大的表达能力,理论上可以学习任何复杂的映射关系}。这也是深度学习能够处理图像、语言、语音等复杂任务的数学基础。 -\section{神经网络技术栈全景} +\subsection{神经网络技术栈全景} \begin{lstlisting} ┌─────────────────────────────────────────────────────────────┐ @@ -345,7 +309,7 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到 └─────────────────────────────────────────────────────────────┘ \end{lstlisting} -\subsection{技术演进路径} +\subsubsection{技术演进路径} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{}lll@{}} @@ -364,7 +328,7 @@ Amazon Go 展示了 AI 技术如何重构传统场景。从“扫码支付”到 \end{longtable} } -\subsection{模型家族关系} +\subsubsection{模型家族关系} \begin{lstlisting} MLP(多层感知机) @@ -384,73 +348,65 @@ MLP(多层感知机) (生成式) (理解式) (图像生成) \end{lstlisting} -\section{Scaling Law:规模即智能} +\subsection{Scaling Law:规模即智能} -\subsection{什么是 Scaling Law} +\subsubsection{什么是 Scaling Law} Scaling Law(缩放定律)描述了模型性能与计算量、数据量、参数量之间的关系: -\textbf{模型性能 ≈ f(计算量, 数据量, 参数量)} +\textbf{模型性能 $\approx$ f(计算量, 数据量, 参数量)} -\subsection{核心发现} +这一发现来自 Kaplan 等人 2020 年的研究(Scaling Laws for Neural Language Models),揭示了一个令人惊讶的规律:模型性能的提升并非随机的,而是可以被精确预测的。 + +\subsubsection{核心发现} \textbf{1. 性能随规模对数增长} \begin{itemize} \tightlist -\item - 模型越大,性能越好 -\item - 增长是可预测的 +\item 模型越大,性能越好 +\item 性能提升的幅度可以量化预测 \end{itemize} \textbf{2. 计算效率最关键} \begin{itemize} \tightlist -\item - 计算量增加 10 倍 → 性能提升约 1.5 倍 -\item - 数据量和参数量也有类似规律 +\item 计算量增加 10 倍,性能提升约 1.5 倍 +\item 数据量和参数量也有类似规律 \end{itemize} \textbf{3. 没有看到天花板} \begin{itemize} \tightlist -\item - 在现有规模下,性能提升仍在继续 +\item 在现有规模下,性能提升仍在继续 \end{itemize} -\subsection{启示} +\subsubsection{启示} \begin{itemize} \tightlist -\item - \textbf{大模型时代}:规模成为竞争壁垒 -\item - \textbf{数据为王}:高质量数据比模型架构更重要 -\item - \textbf{算力需求}:AI 发展依赖硬件进步 +\item \textbf{大模型时代}:规模成为竞争壁垒 +\item \textbf{数据为王}:高质量数据比模型架构更重要 +\item \textbf{算力需求}:AI 发展依赖硬件进步 +\item \textbf{对设计领域的意义}:开源大模型的涌现使得小型设计团队也能获得强大的 AI 能力,降低了技术门槛 \end{itemize} -\section{从函数式视角看 AI 演进} +\subsection{从函数式视角看 AI 演进} -\subsection{核心理念} +\subsubsection{核心理念} -\textbf{``Functions Describe the World''(函数描述世界)} +\textbf{``Functions Describe the World''(函数描述世界)}——这一理念由美国威廉姆斯学院(Williams College)数学教授 Thomas Garrity 提出。他认为数学各分支本质上都在研究不同类型的函数:代数研究多项式函数,微积分研究光滑函数,线性代数研究线性变换。而世间万物——从声波在耳膜上的振动,到光线在视网膜上的投影——都可以用函数来描述。 \begin{itemize} \tightlist -\item - 物理定律:F = ma -\item - 经济规律:Supply = Demand(Price) -\item - 神经网络:y = f(x; θ) +\item 物理定律:$F = ma$ +\item 经济规律:Supply = Demand(Price) +\item 神经网络:$y = f(x; \theta)$ \end{itemize} -\subsection{AI 即函数组合} +\subsubsection{AI 即函数组合} \begin{lstlisting} 输入数据 x @@ -474,7 +430,7 @@ Scaling Law(缩放定律)描述了模型性能与计算量、数据量、参 输出 y \end{lstlisting} -\subsection{从 Excel 到神经网络} +\subsubsection{从 Excel 到神经网络} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{}ll@{}} @@ -491,17 +447,27 @@ y = a₁x₁ + a₂x₂ + b & 多输入神经元 \\ \end{longtable} } +\section{本章小结} + +本章从两个维度建立了对人工智能的宏观认知。 + +在第一节中,我们沿着时间线梳理了 AI 从萌芽到爆发的关键节点,了解了 AIGC、Agent、AI4S、AIED 四大赛道及其对设计领域的影响。Amazon Go 的案例让我们看到,AI 技术的组合可以重构一个完整的物理场景——这暗示着设计领域同样存在系统化变革的可能。 + +在第二节中,我们审视了 AI 范式的三次演进——从人类编写规则,到机器从数据中学习,再到端到端的深度学习。万能逼近定理告诉我们神经网络理论上可以学习任何映射关系,Scaling Law 则揭示了模型性能的可预测性。而"函数描述世界"的视角,为理解后续章节中的各类神经网络架构提供了统一的认知框架。 + +理解了 AI 的过去和现在,下一章我们将进入 AI 的内部——看看神经网络究竟是如何"学习"的。 + \section{思考与练习} \begin{enumerate} \def\labelenumi{\arabic{enumi}.} \tightlist -\item - 万能逼近定理告诉我们神经网络“能”做任何事,但没有说“如何”高效学习。这个区别意味着什么? -\item - Scaling Law 是否意味着“越大越好”?在资源有限的情况下,应该如何权衡? -\item - 从函数式视角理解 AI,对你理解设计问题有何启发? +\item 选择你熟悉的设计领域,分析 AI 在该领域的应用现状和潜力。 +\item 思考 AI 四大赛道中,哪一个对你的专业影响最大?为什么? +\item Amazon Go 案例中,哪些 AI 技术可以迁移到设计领域? +\item 万能逼近定理告诉我们神经网络"能"做任何事,但没有说"如何"高效学习。这个区别意味着什么? +\item Scaling Law 是否意味着"越大越好"?在资源有限的情况下,应该如何权衡? +\item 从函数式视角理解 AI,对你理解设计问题有何启发? \end{enumerate} @@ -541,12 +507,8 @@ AI in Education & AIED & AI 教育应用 \\ \begin{itemize} \tightlist -\item - \href{https://arxiv.org/abs/2001.08361}{Scaling Laws for Neural Language Models} -\item - \href{https://en.wikipedia.org/wiki/Universal_approximation_theorem}{Universal Approximation Theorem} -\item - \href{https://www.nature.com/articles/s41586-023-06221-x}{The Evolution of AI: A Historical Perspective} -\item - \href{https://arxiv.org/pdf/2308.11432v2}{AI Agent 综述论文} +\item \href{https://arxiv.org/abs/2001.08361}{Scaling Laws for Neural Language Models} +\item \href{https://en.wikipedia.org/wiki/Universal_approximation_theorem}{Universal Approximation Theorem} +\item \href{https://www.nature.com/articles/s41586-023-06221-x}{The Evolution of AI: A Historical Perspective} +\item \href{https://arxiv.org/pdf/2308.11432v2}{AI Agent 综述论文} \end{itemize} diff --git a/chapters/ch02-framework.tex b/chapters/ch02-framework.tex index fb0be03..bce2998 100644 --- a/chapters/ch02-framework.tex +++ b/chapters/ch02-framework.tex @@ -1,22 +1,24 @@ \chapter{设计人工智能的理论框架} -本章建立全书的核心理论框架。我们从“函数描述世界”的理念出发,引入数据模态(Data Modality)作为理解AI技术的组织原则,梳理从小模型到大模型的统一演进规律,并以多层感知机(MLP)作为一切深度学习的基础模型进行系统讲解。 +本章建立全书的核心理论框架。从“函数描述世界”的理念出发,引入数据模态(Data +Modality)作为理解AI技术的组织原则,梳理从小模型到大模型的统一演进规律,并以多层感知机(MLP)作为一切深度学习的基础模型进行系统讲解。 -\section{篇章导读} +- +理解AI不需要逐一学习每种技术。核心理念是:\textbf{所有AI技术都是围绕不同类型的数据(模态)来学习函数}。不同的技术采用不同的方法“获得”这个函数。 -理解AI不需要逐一学习每种技术。核心理念是:\textbf{所有AI技术都是围绕不同类型的数据(模态)来学习函数}。 - -无论是处理文本、图像还是三维空间数据,AI的本质工作都是一样的——从数据中学习映射函数 \(y = f(x; \theta)\)。区别仅在于输入数据的形态不同,因此需要不同的网络结构来高效处理。 - -本章将: - 从函数式视角理解AI的本质 - 建立基于数据模态的全书知识地图 - 揭示所有AI技术背后的统一演进规律 - 深入讲解MLP这一最基础的神经网络 - 建立“环境-智能体-任务”实践框架,降低上手门槛 +- +无论是处理文本、图像还是三维空间数据,AI的本质工作都是一样的——从数据中学习映射函数 +\(y = f(x;\theta)\)。区别仅在于输入数据的形态不同,因此需要不同的网络结构来高效处理。 +- 本章将从函数式视角理解AI的本质 - 建立基于数据模态的全书知识地图 - +揭示所有AI技术背后的统一演进规律 - 深入讲解MLP这一最基础的神经网络 - +建立“环境-智能体-任务”实践框架,降低上手门槛。 \section{函数式AI视角} \subsection{学习目标} \begin{itemize} -\tightlist \item 理解“Functions Describe the World”的核心理念 \item @@ -27,20 +29,29 @@ \subsection{物理定律:用函数描述世界} -物理学是最早用数学函数描述世界的学科。人类科学家花费数百年时间,发现了许多简洁而优美的函数关系: +正如 Garrity 在其著作 \textit{All the Math You Missed} 中所言:``The mantra that we should all chant each night before bed is: Functions Describe the World.'' 物理学是最早践行这一理念的学科。人类科学家花费数百年时间,发现了许多简洁而优美的函数关系: {\def\LTcaptype{none} % do not increment counter -\begin{longtable}[]{@{}lll@{}} +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1528}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.5417}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1528}}@{}} \toprule\noalign{} -现象 & 函数 & 发现者 \\ +\begin{minipage}[b]{\linewidth}\raggedright +现象 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +函数 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +发现者 +\end{minipage} \\ \midrule\noalign{} \endhead \bottomrule\noalign{} \endlastfoot -自由落体 & \(h = \frac{1}{2}gt^2\) & 伽利略 \\ -万有引力 & \(F = \frac{Gm_1m_2}{r^2}\) & 牛顿 \\ -电磁感应 & \(\varepsilon = -\frac{d\Phi}{dt}\) & 法拉第 \\ -质能等价 & \(E = mc^2\) & 爱因斯坦 \\ +自由落体 & \(h = \frac{1}{2}gt^{2}\) & 伽利略 \\ +万有引力 & \(F = \frac{Gm_{1}m_{2}}{r^{2}}\) & 牛顿 \\ +电磁感应 & \(\varepsilon = - \frac{d\Phi}{dt}\) & 法拉第 \\ +质能等价 & \(E = mc^{2}\) & 爱因斯坦 \\ \end{longtable} } @@ -50,79 +61,111 @@ AI延续了这一传统,但方式截然不同——\textbf{不是由人类发现函数,而是让机器从数据中自动学习函数}。 -\begin{lstlisting} -传统科学: 观察 → 假设 → 验证 → 发现函数 f(x) -AI方法: 数据 → 训练 → 学习函数 y = f(x; θ) -\end{lstlisting} +传统科学: 观察 → 假设 → 验证 → 发现函数 f(x)\\ +AI方法: 数据 → 训练 → 学习函数 y = f(x; θ) 在AI中,函数的一般形式为: -\[y = f(x; \theta)\] +\[y = f(x;\theta)\] -其中: - \(x\) 是\textbf{输入}(如图像、文本、传感器数据) - \(y\) 是\textbf{输出}(如分类标签、预测值、生成内容) - \(\theta\) 是\textbf{可学习参数}(通过训练自动确定) - \(f\) 是\textbf{模型结构}(我们设计的函数框架) +其中: - \(x\) 是\textbf{输入}(如图像、文本、传感器数据) - \(y\) +是\textbf{输出}(如分类标签、预测值、生成内容) - \(\theta\) +是\textbf{可学习参数}(通过训练自动确定) - \(f\) +是\textbf{模型结构}(我们设计的函数框架) -关键区别在于:物理定律中的函数形式是人为确定的(如 \(F=ma\)),而AI中的函数形式由神经网络自动学习,参数 \(\theta\) 通过海量数据训练得到。 +关键区别在于:物理定律中的函数形式是人为确定的(如 +\(F = ma\)),而AI中的函数形式由神经网络自动学习,参数 \(\theta\) +通过海量数据训练得到。 \subsection{从Excel线性回归到神经网络} 这个过程可以用一个渐进的例子来理解。 -\textbf{第一步:简单线性回归(Excel就能做)} +\subsubsection{简单线性回归(Excel就能做)} 预测房价,只有一个输入变量——面积: \[房价 \approx 0.015 \times 面积 + 50万\] -这就是 \(y = ax + b\),最简单的线性函数。在Excel中,我们可以用趋势线功能轻松完成。 +这就是 +\(y = ax + b\),最简单的线性函数。在Excel中,我们可以用趋势线功能轻松完成。 -\textbf{第二步:多元回归} +\subsubsection{多元回归} 增加更多特征: \[房价 \approx 0.01 \times 面积 + 0.5 \times 卧室数 + 0.3 \times 地段评分 - 20万\] -这就是 \(y = a_1x_1 + a_2x_2 + a_3x_3 + b\)。从数学上看,这已经是\textbf{单个神经元}的完整形式。 +这就是 +\(y = a_{1}x_{1} + a_{2}x_{2} + a_{3}x_{3} + b\)。从数学上看,这已经是\textbf{单个神经元}的完整形式。 -\textbf{第三步:多层函数组合} +\subsubsection{多层函数组合} 现实世界的关系往往不是简单的线性关系。我们需要将多个函数组合起来: -\begin{lstlisting} -h₁ = σ(W₁x + b₁) # 第一层:提取基础特征 -h₂ = σ(W₂h₁ + b₂) # 第二层:组合高级特征 -y = σ(W₃h₂ + b₃) # 第三层:输出最终结果 -\end{lstlisting} +\begin{enumerate} +\def\labelenumi{\alph{enumi}.} +\setcounter{enumi}{7} +\item + ₁ = σ(W₁x + b₁) \# 第一层:提取基础特征 +\item + ₂ = σ(W₂h₁ + b₂) \# 第二层:组合高级特征 +\end{enumerate} + +y = σ(W₃h₂ + b₃) \# 第三层:输出最终结果 这就是\textbf{多层神经网络}。每一层都在做线性变换加非线性激活,层层嵌套形成复杂的能力。 \textbf{Python代码示例:简单线性回归} -\begin{lstlisting}[language=Python] -import numpy as np -import matplotlib.pyplot as plt +\textbf{import} numpy \textbf{as} np + +\textbf{import} matplotlib.pyplot \textbf{as} plt + +\emph{\# 生成模拟数据:面积(平方米)与房价(万元)} -# 生成模拟数据:面积(平方米)与房价(万元) np.random.seed(42) -areas = np.random.uniform(50, 200, 100) # 50-200平方米 -prices = 0.015 * areas + 50 + np.random.normal(0, 10, 100) # 加入噪声 -# 使用最小二乘法拟合线性函数 y = ax + b -X = np.column_stack([areas, np.ones_like(areas)]) # 构造设计矩阵 -theta = np.linalg.lstsq(X, prices, rcond=None)[0] # 求解参数 +areas = np.random.uniform(50, 200, 100) \emph{\# 50-200平方米} + +prices = 0.015 * areas + 50 + np.random.normal(0, 10, 100) \emph{\# +加入噪声} + +\emph{\# 使用最小二乘法拟合线性函数 y = ax + b} + +X = np.column\_stack({[}areas, np.ones\_like(areas){]}) \emph{\# +构造设计矩阵} + +theta = np.linalg.lstsq(X, prices, rcond=None){[}0{]} \emph{\# 求解参数} a, b = theta -print(f"学到的函数: 房价 = {a:.4f} × 面积 + {b:.2f}") -print(f"真实函数: 房价 = 0.0150 × 面积 + 50.00") -# 可视化 +print(f"学到的函数: 房价 = \{a:.4f\} × 面积 + \{b:.2f\}") + +print(f"真实函数: 房价 = 0.0150 × 面积 + 50.00") + +\emph{\# 可视化} + plt.figure(figsize=(8, 5)) -plt.scatter(areas, prices, alpha=0.5, label='数据点') -plt.plot(areas, a * areas + b, 'r-', linewidth=2, label=f'拟合: y={a:.4f}x+{b:.1f}') -plt.xlabel('面积(平方米)') -plt.ylabel('房价(万元)') -plt.title('线性回归:从数据中学习函数') + +plt.scatter(areas, prices, alpha=0.5, +label=\textquotesingle 数据点\textquotesingle) + +plt.plot(areas, a * areas + b, \textquotesingle r-\textquotesingle, +linewidth=2, label=f\textquotesingle 拟合: +y=\{a:.4f\}x+\{b:.1f\}\textquotesingle) + +plt.xlabel(\textquotesingle 面积(平方米)\textquotesingle) + +plt.ylabel(\textquotesingle 房价(万元)\textquotesingle) + +plt.title(\textquotesingle 线性回归:从数据中学习函数\textquotesingle) + plt.legend() + plt.grid(True, alpha=0.3) + +\begin{lstlisting} plt.show() \end{lstlisting} @@ -134,41 +177,37 @@ plt.show() \textbf{规则驱动(传统编程)} -\begin{lstlisting}[language=Python] -# 传统方式:人工编写判断规则 -def classify_design_style(image): - if has_minimal_lines(image) and is_monochrome(image): - return "极简主义" - elif has_curved_forms(image) and is_colorful(image): - return "波普风格" - # ... 需要穷举所有情况 - return "未知风格" -\end{lstlisting} +\emph{\# 传统方式:人工编写判断规则}\\ +\textbf{def} classify\_design\_style(image):\\ +\textbf{if} has\_minimal\_lines(image) \textbf{and} +is\_monochrome(image):\\ +\textbf{return} "极简主义"\\ +\textbf{elif} has\_curved\_forms(image) \textbf{and} +is\_colorful(image):\\ +\textbf{return} "波普风格"\\ +\emph{\# ... 需要穷举所有情况}\\ +\textbf{return} "未知风格" -问题: - 规则难以穷举所有情况 - 边界情况(edge case)无法覆盖 - 无法处理模糊和不确定的情况 - 维护成本随复杂度指数增长 +问题: - 规则难以穷举所有情况 - 边界情况(edge case)无法覆盖 - +无法处理模糊和不确定的情况 - 维护成本随复杂度指数增长 -\textbf{数据驱动(AI方法)} +\subsubsection{数据驱动(AI方法)} -\begin{lstlisting}[language=Python] -# AI方式:从标注数据中自动学习 -model = NeuralNetwork() -model.train(thousands_of_labeled_images) # 从数据中学习规律 -result = model.predict(new_image) # 自动判断 -\end{lstlisting} +\emph{\# AI方式:从标注数据中自动学习}\\ +model = NeuralNetwork()\\ +model.train(thousands\_of\_labeled\_images) \emph{\# 从数据中学习规律}\\ +result = model.predict(new\_image) \emph{\# 自动判断} -优势: - 自动发现人类难以表达的规律 - 数据越多,性能越好 - 可以处理复杂的、非线性的关系 - 适应性强,可迁移到新任务 +优势: - 自动发现人类难以表达的规律 - 数据越多,性能越好 - +可以处理复杂的、非线性的关系 - 适应性强,可迁移到新任务 -\begin{quote} \textbf{设计思维的转变}:从“设计规则”到“设计数据”。在AI时代,设计师不仅要设计规则(设计语言、规范),还要设计和管理训练数据,因为数据决定了AI学到的函数。 -\end{quote} - \section{数据模态全景} -\subsection{学习目标} +学习目标 \begin{itemize} -\tightlist \item 理解数据模态(Data Modality)的概念 \item @@ -179,13 +218,13 @@ result = model.predict(new_image) # 自动判断 \subsection{什么是数据模态} -\textbf{模态(Modality)} 是指信息的存在形式和感知方式。人类通过不同感官感知不同模态的信息:耳朵感知声音(一维时间序列),眼睛感知图像(二维像素矩阵),身体感知空间(三维坐标)。 +\textbf{模态(Modality)} +是指信息的存在形式和感知方式。人类通过不同感官感知不同模态的信息:耳朵感知声音(一维时间序列),眼睛感知图像(二维像素矩阵),身体感知空间(三维坐标)。 AI同样需要针对不同模态的数据采用不同的处理方式。一种数据模态决定了: \begin{enumerate} \def\labelenumi{\arabic{enumi}.} -\tightlist \item \textbf{数据的组织形式}:文本是符号序列,图像是像素矩阵,三维数据是点云或网格 \item @@ -204,13 +243,13 @@ AI同样需要针对不同模态的数据采用不同的处理方式。一种数 {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.0857}} - >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1286}} - >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1286}} - >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1286}} - >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.2714}} - >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1286}} - >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1286}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1337}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.0756}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.1337}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.0988}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.2326}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.2500}} + >{\raggedright\arraybackslash}p{(\linewidth - 12\tabcolsep) * \real{0.0640}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 模态 @@ -231,12 +270,21 @@ AI同样需要针对不同模态的数据采用不同的处理方式。一种数 \endhead \bottomrule\noalign{} \endlastfoot -\textbf{一维:文本与序列} & 1D & 文本、时间序列、音乐 & Token序列 & RNN → LSTM → BERT → GPT-4 & 设计文本生成、用户评论分析、设计趋势预测 & 第3章 \\ -\textbf{二维:图像与视觉} & 2D & 图像、视觉设计稿 & 像素矩阵 & LeNet → ResNet → ViT → SAM & 图像分类、目标检测、风格迁移、设计评估 & 第4章 \\ -\textbf{三维:空间与几何} & 3D & 点云、网格、体素 & 3D坐标集 & PointNet → DGCNN → Point Transformer & 三维重建、空间分析、建筑设计、数字孪生 & 第5章 \\ -\textbf{决策序列} & 时序决策 & 状态-动作对 & 状态→动作映射 & Q-Learning → DQN → PPO → AlphaGo & 布局优化、参数调优、自适应设计 & 第6章 \\ -\textbf{生成} & 创造性输出 & 图像、文本、音频 & 噪声/条件 & VAE → GAN → Diffusion → Sora & AIGC设计、概念生成、风格迁移、设计探索 & 第7章 \\ -\textbf{行动序列} & 多步行动 & 任务-工具-行动链 & 目标→计划→执行 & ReAct → Toolformer → AutoGPT → GPT-4V & 智能设计助手、自动化工作流、多Agent协作 & 第8章 \\ +\textbf{一维:文本与序列} & 1D & 文本、时间序列、音乐 & Token序列 & RNN +→ LSTM → BERT → GPT-4 & 设计文本生成、用户评论分析、设计趋势预测 & +第3章 \\ +\textbf{二维:图像与视觉} & 2D & 图像、视觉设计稿 & 像素矩阵 & LeNet → +ResNet → ViT → SAM & 图像分类、目标检测、风格迁移、设计评估 & 第4章 \\ +\textbf{三维:空间与几何} & 3D & 点云、网格、体素 & 3D坐标集 & PointNet +→ DGCNN → Point Transformer & 三维重建、空间分析、建筑设计、数字孪生 & +第5章 \\ +\textbf{决策序列} & 时序决策 & 状态-动作对 & 状态→动作映射 & Q-Learning +→ DQN → PPO → AlphaGo & 布局优化、参数调优、自适应设计 & 第6章 \\ +\textbf{生成} & 创造性输出 & 图像、文本、音频 & 噪声/条件 & VAE → GAN → +Diffusion → Sora & AIGC设计、概念生成、风格迁移、设计探索 & 第7章 \\ +\textbf{行动序列} & 多步行动 & 任务-工具-行动链 & 目标→计划→执行 & ReAct +→ Toolformer → AutoGPT → GPT-4V & +智能设计助手、自动化工作流、多Agent协作 & 第8章 \\ \end{longtable} } @@ -244,49 +292,53 @@ AI同样需要针对不同模态的数据采用不同的处理方式。一种数 这六种模态并非孤立存在,它们之间存在密切的内在联系: -\begin{lstlisting} - ┌──────────────┐ - │ 一维:序列 │ - │ (第3章) │ - └──────┬───────┘ - │ 序列化的基础 - ┌──────┴───────┐ - │ 二维:视觉 │ - │ (第4章) │ - └──────┬───────┘ - │ 空间维度的扩展 - ┌──────┴───────┐ - │ 三维:空间 │ - │ (第5章) │ - └──────┬───────┘ - │ - ┌────────────┼────────────┐ - │ │ │ - ┌──────┴──────┐ ┌──┴───┐ ┌──────┴──────┐ - │ 决策序列 │ │ 生成 │ │ 行动序列 │ - │ (第6章) │ │(第7章)│ │ (第8章) │ - └─────────────┘ └──────┘ └─────────────┘ -\end{lstlisting} +┌──────────────┐\\ +│ 一维:序列 │\\ +│ (第3章) │\\ +└──────┬───────┘\\ +│ 序列化的基础\\ +┌──────┴───────┐\\ +│ 二维:视觉 │\\ +│ (第4章) │\\ +└──────┬───────┘\\ +│ 空间维度的扩展\\ +┌──────┴───────┐\\ +│ 三维:空间 │\\ +│ (第5章) │\\ +└──────┬───────┘\\ +│\\ +┌────────────┼────────────┐\\ +│ │ │\\ +┌──────┴──────┐ ┌──┴───┐ ┌──────┴──────┐\\ +│ 决策序列 │ │ 生成 │ │ 行动序列 │\\ +│ (第6章) │ │(第7章)│ │ (第8章) │\\ +└─────────────┘ └──────┘ └─────────────┘ -\textbf{从感知到行动的逻辑链条}: - \textbf{一维到三维}是感知智能的递进——从理解语言、识别图像到感知空间 - \textbf{决策序列}将感知转化为行动策略——在环境中做出最优选择 - \textbf{生成}突破感知的局限——不仅理解,还能创造新内容 - \textbf{行动序列}整合所有能力——感知、规划、执行形成闭环 +\textbf{从感知到行动的逻辑链条}: - +\textbf{一维到三维}是感知智能的递进——从理解语言、识别图像到感知空间 +- \textbf{决策序列}将感知转化为行动策略——在环境中做出最优选择 - +\textbf{生成}突破感知的局限——不仅理解,还能创造新内容 - +\textbf{行动序列}整合所有能力——感知、规划、执行形成闭环 \subsection{为什么模态是有用的组织原则} -\textbf{第一,降低学习门槛。} 不需要一次性理解所有AI技术,只需要按数据类型逐一学习。理解了文本处理的方法后,很多概念可以直接迁移到图像处理。 +\textbf{第一,降低学习门槛。} +不需要一次性理解所有AI技术,只需要按数据类型逐一学习。理解了文本处理的方法后,很多概念可以直接迁移到图像处理。 -\textbf{第二,揭示统一规律。} 虽然不同模态使用的网络结构不同,但背后遵循相同的学习范式——都是从小模型到大模型的演进(见2.3节)。 +\textbf{第二,揭示统一规律。} +虽然不同模态使用的网络结构不同,但背后遵循相同的学习范式——都是从小模型到大模型的演进(见2.3节)。 -\textbf{第三,对应设计实践。} 设计师日常接触的信息天然是按模态划分的:文字(设计说明)、图像(效果图)、三维模型(空间设计)。按模态组织知识,便于直接找到所需技术。 - -\textbf{第四,预见技术趋势。} 理解了模态框架,就能更好地理解多模态(Multimodal)AI的发展方向——让AI同时处理多种模态的数据,正如人类同时用视觉、听觉和触觉感知世界。 +\textbf{第三,对应设计实践。} +设计师日常接触的信息天然是按模态划分的:文字(设计说明)、图像(效果图)、三维模型(空间设计)。按模态组织知识,便于直接找到所需技术。 +\textbf{第四,预见技术趋势。} +理解了模态框架,就能更好地理解多模态(Multimodal)AI的发展方向——让AI同时处理多种模态的数据,正如人类同时用视觉、听觉和触觉感知世界。 \section{小模型到大模型的演进规律} -\subsection{学习目标} +学习目标 \begin{itemize} -\tightlist \item 理解AI技术发展的四个阶段 \item @@ -299,39 +351,46 @@ AI同样需要针对不同模态的数据采用不同的处理方式。一种数 纵观AI各个模态的发展历程,可以提炼出一个统一的四阶段演进模式: -\textbf{第一阶段:手工特征时代(Hand-crafted Features)} +\subsubsection{第一阶段:手工特征时代(Hand-crafted Features)} -人类专家根据领域知识,手工设计特征提取方法。例如,图像处理中的边缘检测算子(Sobel、Canny)、纹理特征(HOG、SIFT),自然语言处理中的词袋模型(Bag of Words)、TF-IDF等。 +人类专家根据领域知识,手工设计特征提取方法。例如,图像处理中的边缘检测算子(Sobel、Canny)、纹理特征(HOG、SIFT),自然语言处理中的词袋模型(Bag +of Words)、TF-IDF等。 -特点: - 特征由人类专家精心设计 - 每个特征都有明确的物理含义 - 性能受限于人类的领域知识和表达能力 - 适合数据量小、计算资源有限的场景 +特点: - 特征由人类专家精心设计 - 每个特征都有明确的物理含义 - +性能受限于人类的领域知识和表达能力 - 适合数据量小、计算资源有限的场景 -\textbf{第二阶段:自动学习时代(Deep Learning)} +\subsubsection{第二阶段:自动学习时代(Deep Learning)} 深度学习让模型自动从原始数据中学习特征。卷积神经网络(CNN)自动学习图像特征,循环神经网络(RNN)自动学习序列特征。 -特点: - 特征由网络自动学习,无需人工设计 - 端到端(End-to-End)的训练方式 - 需要大量标注数据 - 性能大幅超越手工特征方法 +特点: - 特征由网络自动学习,无需人工设计 - +端到端(End-to-End)的训练方式 - 需要大量标注数据 - +性能大幅超越手工特征方法 -\textbf{第三阶段:预训练时代(Pre-training)} +\subsubsection{第三阶段:预训练时代(Pre-training)} 通过在大规模无标注数据上的预训练,模型学习通用知识,再通过微调(Fine-tuning)适配具体任务。迁移学习使得少量标注数据也能获得优秀性能。 -特点: - 先预训练学通用知识,再微调适配任务 - 大幅减少对标注数据的依赖 - 模型开始具备迁移和泛化能力 - “预训练+微调”成为标准范式 +特点: - 先预训练学通用知识,再微调适配任务 - 大幅减少对标注数据的依赖 - +模型开始具备迁移和泛化能力 - ``预训练+微调“成为标准范式 -\textbf{第四阶段:大模型时代(Foundation Models)} +\subsubsection{第四阶段:大模型时代(Foundation Models)} -参数规模达到十亿甚至万亿级别的模型,展现出“涌现能力”(Emergent Abilities)——模型规模大到一定程度后,突然具备了小模型没有的新能力。 +参数规模达到十亿甚至万亿级别的模型,展现出”涌现能力''(Emergent +Abilities)——模型规模大到一定程度后,突然具备了小模型没有的新能力。 -特点: - 单一模型处理多种任务(通用性) - 涌现能力:规模带来质变 - 少样本甚至零样本学习 - Scaling Law:性能随规模持续提升 +特点: - 单一模型处理多种任务(通用性) - 涌现能力:规模带来质变 - +少样本甚至零样本学习 - Scaling Law:性能随规模持续提升 \subsection{四阶段对比} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1154}} - >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2308}} - >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2308}} - >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2115}} - >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2115}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1919}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2020}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1717}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2222}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1919}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 维度 @@ -349,11 +408,14 @@ AI同样需要针对不同模态的数据采用不同的处理方式。一种数 \bottomrule\noalign{} \endlastfoot \textbf{特征提取方式} & 人工设计 & 自动学习 & 预训练+微调 & 涌现学习 \\ -\textbf{数据需求} & 少量标注数据 & 大量标注数据 & 大量无标注+少量标注 & 海量多模态数据 \\ +\textbf{数据需求} & 少量标注数据 & 大量标注数据 & 大量无标注+少量标注 & +海量多模态数据 \\ \textbf{计算资源} & CPU即可 & 需要GPU & 需要多GPU & 需要大规模集群 \\ \textbf{模型特点} & 任务专用 & 任务专用但自动 & 可迁移 & 通用基础模型 \\ -\textbf{典型模型} & SIFT、HOG、TF-IDF & AlexNet、LSTM & BERT、ResNet & GPT-4、SAM、Sora \\ -\textbf{设计影响} & 基础图像处理 & 自动化设计分析 & 设计知识迁移 & 通用设计智能 \\ +\textbf{典型模型} & SIFT、HOG、TF-IDF & AlexNet、LSTM & BERT、ResNet & +GPT-4、SAM、Sora \\ +\textbf{设计影响} & 基础图像处理 & 自动化设计分析 & 设计知识迁移 & +通用设计智能 \\ \end{longtable} } @@ -361,118 +423,99 @@ AI同样需要针对不同模态的数据采用不同的处理方式。一种数 每种模态都经历了相同的四个阶段,只是时间线略有不同: -\textbf{文本与序列(一维)} +\subsubsection{文本与序列(一维)} + +手工特征 自动学习 预训练 大模型\\ +TF-IDF → Word2Vec → BERT (2018) → GPT-4 (2023)\\ +词袋模型 LSTM/GRU ELMo Claude\\ +N-gram Seq2Seq T5 Llama + +\subsubsection{图像与视觉(二维)} + +手工特征 自动学习 预训练 大模型\\ +SIFT → AlexNet → ResNet → SAM (2023)\\ +HOG VGGNet EfficientNet DINOv2\\ +Canny边缘 YOLO CLIP GPT-4V + +\subsubsection{三维空间(三维)} \begin{lstlisting} 手工特征 自动学习 预训练 大模型 -TF-IDF → Word2Vec → BERT (2018) → GPT-4 (2023) -词袋模型 LSTM/GRU ELMo Claude -N-gram Seq2Seq T5 Llama \end{lstlisting} -\textbf{图像与视觉(二维)} - -\begin{lstlisting} -手工特征 自动学习 预训练 大模型 -SIFT → AlexNet → ResNet → SAM (2023) -HOG VGGNet EfficientNet DINOv2 -Canny边缘 YOLO CLIP GPT-4V -\end{lstlisting} - -\textbf{三维空间(三维)} - -\begin{lstlisting} -手工特征 自动学习 预训练 大模型 -FPFH → PointNet → Point-BERT → Point-E -3D形状上下文 DGCNN Point-MAE Shape-E -体素特征 PointNet++ ULIP LRM -\end{lstlisting} - -\textbf{生成模型} - -\begin{lstlisting} -手工特征 自动学习 预训练 大模型 -规则模板 → VAE/GAN → StyleGAN → Stable Diffusion -马尔可夫链 PixelCNN BigGAN DALL-E 3 -分形算法 CycleGAN Craiyon Sora -\end{lstlisting} - -\begin{quote} -\textbf{关键洞察}:无论哪种模态,发展路径都遵循相同的规律——从人工设计到自动学习,从专用到通用,从小规模到大规模。理解了这个规律,即使面对全新的AI技术,也能快速定位它所处的阶段和意义。 -\end{quote} - -\subsection{对设计师的启示} +FPFH → PointNet → Point-BERT → Point-E \begin{enumerate} \def\labelenumi{\arabic{enumi}.} +\setcounter{enumi}{4} +\tightlist \item - \textbf{不要被具体模型名称迷惑}。模型千变万化,但底层逻辑相同。重要的是理解它属于哪个阶段、处理什么模态的数据。 -\item - \textbf{关注趋势而非细节}。AI技术迭代极快,具体的模型可能很快过时,但从手工到自动、从小到大的趋势不会改变。 -\item - \textbf{预训练时代是设计师的最佳入口}。利用预训练模型,设计师不需要海量数据和强大算力,就能将AI应用到设计实践中。 -\item - \textbf{大模型时代带来“民主化”}。大模型通过自然语言交互降低了AI的使用门槛,设计师可以用自然语言指挥AI完成设计任务。 + D形状上下文 DGCNN Point-MAE Shape-E \end{enumerate} +\begin{lstlisting} +体素特征 PointNet++ ULIP LRM +\end{lstlisting} + +\subsubsection{生成模型} + +手工特征 自动学习 预训练 大模型\\ +规则模板 → VAE/GAN → StyleGAN → Stable Diffusion\\ +马尔可夫链 PixelCNN BigGAN DALL-E 3\\ +分形算法 CycleGAN Craiyon Sora + +\textbf{关键洞察}:无论哪种模态,发展路径都遵循相同的规律——从人工设计到自动学习,从专用到通用,从小规模到大规模。理解了这个规律,即使面对全新的AI技术,也能快速定位它所处的阶段和意义。 + +\subsection{对设计师的启示} + +1.\textbf{不要被具体模型名称迷惑}。模型千变万化,但底层逻辑相同。重要的是理解它属于哪个阶段、处理什么模态的数据。 + +2.\textbf{关注趋势而非细节}。AI技术迭代极快,具体的模型可能很快过时,但从手工到自动、从小到大的趋势不会改变。 + +3.\textbf{预训练时代是设计师的最佳入口}。利用预训练模型,设计师不需要海量数据和强大算力,就能将AI应用到设计实践中。 + +4.\textbf{大模型时代带来“民主化”}。大模型通过自然语言交互降低了AI的使用门槛,设计师可以用自然语言指挥AI完成设计任务。 \section{MLP:一切的基础} -\subsection{学习目标} - -\begin{itemize} -\tightlist -\item - 理解多层感知机(MLP)的网络架构 -\item - 掌握前向传播的计算过程 -\item - 了解激活函数、损失函数和反向传播的基本原理 -\item - 建立对神经网络训练过程的完整认知 -\end{itemize} - \subsection{为什么MLP如此重要} -多层感知机(Multi-Layer Perceptron, MLP)是最基础的神经网络结构。虽然现代AI使用CNN、Transformer等更复杂的架构,但它们的底层构件仍然是MLP中的基本操作:线性变换、非线性激活、损失计算和梯度更新。 +多层感知机(Multi-Layer Perceptron, +MLP)是最基础的神经网络结构。虽然现代AI使用CNN、Transformer等更复杂的架构,但它们的底层构件仍然是MLP中的基本操作:线性变换、非线性激活、损失计算和梯度更新。 \textbf{理解MLP是理解所有深度学习的起点。} -\begin{lstlisting} -MLP(多层感知机) - │ - ├── CNN(卷积神经网络)= 局部连接的MLP + 权重共享 - │ - ├── RNN(循环神经网络)= 共享参数的MLP + 时间展开 - │ - └── Transformer = 注意力机制 + MLP -\end{lstlisting} +MLP(多层感知机)\\ +│\\ +├── CNN(卷积神经网络)= 局部连接的MLP + 权重共享\\ +│\\ +├── RNN(循环神经网络)= 共享参数的MLP + 时间展开\\ +│\\ +└── Transformer = 注意力机制 + MLP \subsection{网络架构} MLP由三种类型的层组成: -\begin{lstlisting} -输入层 隐藏层1 隐藏层2 输出层 -┌─────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────┐ -│ x₁ │ │ h₁ │ │ g₁ │ │ y₁ │ -│ x₂ │───→│ h₂ │──→│ g₂ │──→│ y₂ │ -│ x₃ │ │ h₃ │ │ g₃ │ │ y₃ │ -│ ... │ │ ... │ │ ... │ │ ... │ -│ xₙ │ │ hₘ │ │ gₖ │ │ yₚ │ -└─────────┘ └─────────────┘ └─────────────┘ └─────────┘ - │ │ │ │ - └───────────────┴─────────────────┴────────────────┘ - 全连接(Fully Connected):每个神经元与上一层所有神经元相连 -\end{lstlisting} +输入层 隐藏层1 隐藏层2 输出层\\ +┌─────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────┐\\ +│ x₁ │ │ h₁ │ │ g₁ │ │ y₁ │\\ +│ x₂ │───→│ h₂ │──→│ g₂ │──→│ y₂ │\\ +│ x₃ │ │ h₃ │ │ g₃ │ │ y₃ │\\ +│ ... │ │ ... │ │ ... │ │ ... │\\ +│ xₙ │ │ hₘ │ │ gₖ │ │ yₚ │\\ +└─────────┘ └─────────────┘ └─────────────┘ └─────────┘\\ +│ │ │ │\\ +└───────────────┴─────────────────┴────────────────┘\\ +全连接(Fully Connected):每个神经元与上一层所有神经元相连 各层的作用: {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3200}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.2400}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4400}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1059}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4588}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4118}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 层类型 @@ -485,7 +528,8 @@ MLP由三种类型的层组成: \endhead \bottomrule\noalign{} \endlastfoot -输入层 & 接收原始数据,每个神经元对应一个特征 & 取决于数据特征数(如图像像素数) \\ +输入层 & 接收原始数据,每个神经元对应一个特征 & +取决于数据特征数(如图像像素数) \\ 隐藏层 & 特征变换与组合,逐步提取高级特征 & 可自由设计(超参数) \\ 输出层 & 产生最终预测结果 & 取决于任务(分类数或回归值数) \\ \end{longtable} @@ -495,103 +539,145 @@ MLP由三种类型的层组成: \subsection{前向传播} -前向传播(Forward Propagation)是数据从输入层经过各隐藏层到达输出层的计算过程。 +前向传播(Forward +Propagation)是数据从输入层经过各隐藏层到达输出层的计算过程。 \textbf{单个神经元的计算} 每个神经元执行两个操作: -\begin{lstlisting} -步骤1:线性变换 z = W₁x₁ + W₂x₂ + ... + Wₙxₙ + b = Wx + b -步骤2:非线性激活 h = σ(z) -\end{lstlisting} +步骤1:线性变换 z = W₁x₁ + W₂x₂ + ... + Wₙxₙ + b = Wx + b\\ +步骤2:非线性激活 h = σ(z) -其中 \(W\) 是权重(Weight),\(b\) 是偏置(Bias),\(\sigma\) 是激活函数(Activation Function)。 +其中 \(W\) 是权重(Weight),\(b\) 是偏置(Bias),\(\sigma\) +是激活函数(Activation Function)。 -\textbf{完整网络的前向传播} +\subsubsection{完整网络的前向传播} 对于L层网络,前向传播逐层计算: -\begin{lstlisting} -# 第1层 -h₁ = σ₁(W₁ · x + b₁) +\# 第1层 + +\begin{enumerate} +\def\labelenumi{\alph{enumi}.} +\setcounter{enumi}{7} +\item + ₁ = σ₁(W₁ · x + b₁) +\item + \# 第2层 +\end{enumerate} -# 第2层 h₂ = σ₂(W₂ · h₁ + b₂) -# ... 第l层 +\# ... 第l层 + hₗ = σₗ(Wₗ · hₗ₋₁ + bₗ) -# 输出层 +\# 输出层 + +\begin{lstlisting} y = hₗ \end{lstlisting} 用更简洁的函数组合表示: -\[y = f_L(f_{L-1}(\cdots f_2(f_1(x))\cdots))\] +\[y = f_{L}(f_{L - 1}(\cdots f_{2}(f_{1}(x))\cdots))\] \textbf{数据流动示意} -\begin{lstlisting} -输入向量 x - │ - ├─→ 线性变换: z₁ = W₁x + b₁ - │ │ - │ └─→ 激活函数: h₁ = σ(z₁) - │ │ - │ └─→ 线性变换: z₂ = W₂h₁ + b₂ - │ │ - │ └─→ 激活函数: h₂ = σ(z₂) - │ │ - │ └─→ ... → y(输出) -\end{lstlisting} +输入向量 x\\ +│\\ +├─→ 线性变换: z₁ = W₁x + b₁\\ +│ │\\ +│ └─→ 激活函数: h₁ = σ(z₁)\\ +│ │\\ +│ └─→ 线性变换: z₂ = W₂h₁ + b₂\\ +│ │\\ +│ └─→ 激活函数: h₂ = σ(z₂)\\ +│ │\\ +│ └─→ ... → y(输出) \textbf{Python代码示例:手动实现前向传播} -\begin{lstlisting}[language=Python] -import numpy as np +\textbf{import} numpy \textbf{as} np -def sigmoid(x): - """Sigmoid激活函数""" - return 1 / (1 + np.exp(-x)) +\textbf{def} sigmoid(x): -def relu(x): - """ReLU激活函数""" - return np.maximum(0, x) +\emph{"""Sigmoid激活函数"""} -# 定义一个简单的3层MLP -# 输入: 4维 → 隐藏层1: 8个神经元 → 隐藏层2: 4个神经元 → 输出: 2维 +\textbf{return} 1 / (1 + np.exp(-x)) -# 初始化权重和偏置(实际中由训练得到) -W1 = np.random.randn(8, 4) * 0.01 # (8, 4) +\textbf{def} relu(x): + +\emph{"""ReLU激活函数"""} + +\textbf{return} np.maximum(0, x) + +\emph{\# 定义一个简单的3层MLP} + +\begin{quote} +\emph{\# 输入: 4维 → 隐藏层1: 8个神经元 → 隐藏层2: 4个神经元 → 输出: +2维} +\end{quote} + +\emph{\# 初始化权重和偏置(实际中由训练得到)} + +W1 = p.random.randn(8, 4) * 0.01 \emph{\# (8, 4)} + +\begin{lstlisting} b1 = np.zeros((8, 1)) # (8, 1) -W2 = np.random.randn(4, 8) * 0.01 # (4, 8) +\end{lstlisting} + +W2 = np.random.randn(4, 8) * 0.01 \emph{\# (4, 8)} + +\begin{lstlisting} b2 = np.zeros((4, 1)) # (4, 1) -W3 = np.random.randn(2, 4) * 0.01 # (2, 4) +\end{lstlisting} + +W3 = np.random.randn(2, 4) * 0.01 \emph{\# (2, 4)} + +\begin{lstlisting} b3 = np.zeros((2, 1)) # (2, 1) +\end{lstlisting} -# 输入数据(4个特征) -x = np.array([[0.5], [0.3], [0.8], [0.1]]) # (4, 1) +\emph{\# 输入数据(4个特征)} -# 前向传播 +x = np.array({[}{[}0.5{]}, {[}0.3{]}, {[}0.8{]}, {[}0.1{]}{]}) \emph{\# +(4, 1)} + +\emph{\# 前向传播} + +\begin{lstlisting} z1 = np.dot(W1, x) + b1 # 线性变换 h1 = relu(z1) # ReLU激活 -z2 = np.dot(W2, h1) + b2 # 线性变换 -h2 = relu(z2) # ReLU激活 -z3 = np.dot(W3, h2) + b3 # 线性变换 -y = sigmoid(z3) # Sigmoid激活(输出层) +\end{lstlisting} -print(f"输入: {x.flatten()}") -print(f"隐藏层1输出: {h1.flatten()}") -print(f"隐藏层2输出: {h2.flatten()}") +z2 = np.dot(W2, h1) + b2 \emph{\# 线性变换} + +\begin{lstlisting} +h2 = relu(z2) # ReLU激活 +\end{lstlisting} + +z3 = np.dot(W3, h2) + b3 \emph{\# 线性变换} + +y = sigmoid(z3) \emph{\# Sigmoid激活(输出层)} + +print(f"输入: \{x.flatten()\}") + +print(f"隐藏层1输出: \{h1.flatten()\}") + +print(f"隐藏层2输出: \{h2.flatten()\}") + +\begin{lstlisting} print(f"最终输出: {y.flatten()}") \end{lstlisting} \subsection{激活函数} -激活函数(Activation Function)是神经网络的“灵魂”。没有激活函数,无论网络有多少层,都等价于一个单层线性变换: +激活函数(Activation +Function)是神经网络的“灵魂”。没有激活函数,无论网络有多少层,都等价于一个单层线性变换: -\[y = W_2(W_1x) = (W_2W_1)x = W'x\] +\[y = W_{2}(W_{1}x) = (W_{2}W_{1})x = W'x\] 激活函数引入\textbf{非线性},使网络能够拟合任意复杂的函数关系。 @@ -599,11 +685,11 @@ print(f"最终输出: {y.flatten()}") {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2308}} - >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1538}} - >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2308}} - >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1538}} - >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2308}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.0805}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.4631}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1074}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.2215}} + >{\raggedright\arraybackslash}p{(\linewidth - 8\tabcolsep) * \real{0.1141}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 激活函数 @@ -620,47 +706,50 @@ print(f"最终输出: {y.flatten()}") \endhead \bottomrule\noalign{} \endlastfoot -Sigmoid & \(\sigma(z) = \frac{1}{1+e^{-z}}\) & (0, 1) & 输出可解释为概率;两端梯度消失 & 二分类输出层 \\ -ReLU & \(\text{ReLU}(z) = \max(0, z)\) & {[}0, +∞) & 计算简单高效;缓解梯度消失 & \textbf{隐藏层首选} \\ -Tanh & \(\tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}\) & (-1, 1) & 零中心化;两端梯度消失 & 循环网络隐藏层 \\ -Softmax & \(\text{softmax}(z_i) = \frac{e^{z_i}}{\sum_j e^{z_j}}\) & (0, 1),和为1 & 输出为概率分布 & 多分类输出层 \\ -LeakyReLU & \(\text{LeakyReLU}(z) = \max(\alpha z, z)\) & (-∞, +∞) & 解决ReLU“死神经元”问题 & 深层网络隐藏层 \\ +Sigmoid & \(\sigma(z) = \frac{1}{1 + e^{- z}}\) & (0, 1) & +输出可解释为概率;两端梯度消失 & 二分类输出层 \\ +ReLU & \(\text{ReLU}(z) = max(0,z)\) & {[}0, +∞) & +计算简单高效;缓解梯度消失 & \textbf{隐藏层首选} \\ +Tanh & \(tanh(z) = \frac{e^{z} - e^{- z}}{e^{z} + e^{- z}}\) & (-1, 1) & +零中心化;两端梯度消失 & 循环网络隐藏层 \\ +Softmax & +\(\text{softmax}(z_{i}) = \frac{e^{z_{i}}}{\sum_{j}^{}e^{z_{j}}}\) & (0, +1),和为1 & 输出为概率分布 & 多分类输出层 \\ +LeakyReLU & \(\text{LeakyReLU}(z) = max(\alpha z,z)\) & (-∞, +∞) & +解决ReLU“死神经元”问题 & 深层网络隐藏层 \\ \end{longtable} } \textbf{视觉对比} -\begin{lstlisting} -ReLU: Sigmoid: Tanh: - ↑ ___ ___ - │ / \ / \ - │ / \ / \ - │ ____ / \ ____ / \ ____ - │___________| │ │ │ │ - └───────────┼──→ └──────────┘ └────────────────────┘ - -∞ 0 +∞ -∞ 0 +∞ -∞ 0 +∞ +ReLU: Sigmoid: Tanh:\\ +↑ \_\_\_ \_\_\_\\ +│ / \textbackslash{} / \textbackslash{}\\ +│ / \textbackslash{} / \textbackslash{}\\ +│ \_\_\_\_ / \textbackslash{} \_\_\_\_ / \textbackslash{} \_\_\_\_\\ +│\_\_\_\_\_\_\_\_\_\_\_\textbar{} │ │ │ │\\ +└───────────┼──→ └──────────┘ └────────────────────┘\\ +-∞ 0 +∞ -∞ 0 +∞ -∞ 0 +∞\\ +\strut \\ +特点:简单,计算快 特点:平滑,输出(0,1) 特点:零中心,输出(-1,1)\\ +正区间梯度恒为1 两端梯度趋近于0 两端梯度趋近于0\\ +负区间输出为0 可能导致梯度消失 可能导致梯度消失 -特点:简单,计算快 特点:平滑,输出(0,1) 特点:零中心,输出(-1,1) -正区间梯度恒为1 两端梯度趋近于0 两端梯度趋近于0 -负区间输出为0 可能导致梯度消失 可能导致梯度消失 -\end{lstlisting} - -\begin{quote} \textbf{设计类比}:激活函数就像是设计中的“非线性思维”。如果只有线性思维(没有激活函数),无论思考多少层,结论都是线性的——就像在一条直线上来回走。激活函数引入了“跳跃”和“拐弯”的能力,让网络能够表达复杂的设计关系。 -\end{quote} \subsection{损失函数} -损失函数(Loss Function)衡量模型预测值与真实值之间的差距,是训练过程的“指南针”。 +损失函数(Loss +Function)衡量模型预测值与真实值之间的差距,是训练过程的“指南针”。 \textbf{常用损失函数} {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2727}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2727}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1818}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2727}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.0815}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.1407}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.5481}} + >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2148}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 任务类型 @@ -675,133 +764,187 @@ ReLU: Sigmoid: Tanh: \endhead \bottomrule\noalign{} \endlastfoot -回归 & 均方误差 (MSE) & \(L = \frac{1}{n}\sum_{i=1}^{n}(\hat{y}_i - y_i)^2\) & 预测值与真实值差的平方平均 \\ -二分类 & 二元交叉熵 (BCE) & \(L = -[y\log\hat{y} + (1-y)\log(1-\hat{y})]\) & 预测概率与真实标签的偏差 \\ -多分类 & 交叉熵 (CE) & \(L = -\sum_{i=1}^{C}y_i\log\hat{y}_i\) & 预测分布与真实分布的差距 \\ +回归 & 均方误差 (MSE) & +\(L = \frac{1}{n}\sum_{i = 1}^{n}({\widehat{y}}_{i} - y_{i})^{2}\) & +预测值与真实值差的平方平均 \\ +二分类 & 二元交叉熵 (BCE) & +\(L = - \lbrack y\log\widehat{y} + (1 - y)log(1 - \widehat{y})\rbrack\) +& 预测概率与真实标签的偏差 \\ +多分类 & 交叉熵 (CE) & +\(L = - \sum_{i = 1}^{C}y_{i}\log{\widehat{y}}_{i}\) & +预测分布与真实分布的差距 \\ \end{longtable} } -其中 \(\hat{y}\) 是模型预测值,\(y\) 是真实值。 +其中 \(\widehat{y}\) 是模型预测值,\(y\) 是真实值。 \textbf{损失函数的直观理解} -\begin{lstlisting} -好的预测: 差的预测: -预测值: ■ 预测值: ■ -真实值: ■ 真实值: ■ -损失小: | 损失大: |——---| -→ 参数调整小 → 参数需要大幅调整 -\end{lstlisting} +好的预测: 差的预测:\\ +预测值: ■ 预测值: ■\\ +真实值: ■ 真实值: ■\\ +损失小: \textbar{} 损失大: \textbar-\/-\/-\/-\/-\/-\/-\/-\/-\textbar{}\\ +→ 参数调整小 → 参数需要大幅调整 \subsection{反向传播与梯度下降} 反向传播(Backpropagation)是训练神经网络的核心算法,它解决了“如何高效计算每个参数对损失的影响程度”这一问题。 -\textbf{核心思想:梯度下降} +\subsubsection{核心思想:梯度下降} 训练目标是最小化损失函数。梯度下降的思想是:沿着损失函数梯度(下降最快的方向)的相反方向更新参数。 -\[\theta = \theta - \alpha \nabla L(\theta)\] +\[\theta = \theta - \alpha\nabla L(\theta)\] -其中: - \(\theta\):模型的所有可学习参数(权重 \(W\) 和偏置 \(b\)) - \(\alpha\):学习率(Learning Rate),控制每次更新的步长 - \(\nabla L(\theta)\):损失函数对参数的梯度 +其中: - \(\theta\):模型的所有可学习参数(权重 \(W\) 和偏置 \(b\)) - +\(\alpha\):学习率(Learning Rate),控制每次更新的步长 - +\(\nabla L(\theta)\):损失函数对参数的梯度 -\textbf{直观理解} +\subsubsection{直观理解} -想象你站在山上某处(当前参数值),目标是到达谷底(最小损失)。梯度下降就是: - 观察脚下地面的坡度(计算梯度) - 沿着最陡的下坡方向走一步(参数更新) - 重复以上步骤直到到达谷底(收敛) +想象你站在山上某处(当前参数值),目标是到达谷底(最小损失)。梯度下降就是: +- 观察脚下地面的坡度(计算梯度) - 沿着最陡的下坡方向走一步(参数更新) +- 重复以上步骤直到到达谷底(收敛) -\begin{lstlisting} -损失 L - │ ╲ - │ ╲ ╱╲ - │ ╲╱ ╲ ← 梯度下降的路径 - │ ╲ ╲ ╱ - │ ╲ ╲╱ - │ ╲ - └───────────────→ 参数 θ -\end{lstlisting} +损失 L\\ +│ ╲\\ +│ ╲ ╱╲\\ +│ ╲╱ ╲ ← 梯度下降的路径\\ +│ ╲ ╲ ╱\\ +│ ╲ ╲╱\\ +│ ╲\\ +└───────────────→ 参数 θ -\textbf{反向传播:高效计算梯度} +\subsubsection{反向传播:高效计算梯度} -反向传播利用\textbf{链式法则(Chain Rule)},从输出层向输入层反向逐层计算梯度: +反向传播利用\textbf{链式法则(Chain +Rule)},从输出层向输入层反向逐层计算梯度: -\begin{lstlisting} 前向传播(计算输出): - x → h₁ → h₂ → ... → y → L(损失) + +\begin{enumerate} +\def\labelenumi{\alph{enumi}.} +\setcounter{enumi}{23} +\tightlist +\item + → h₁ → h₂ → ... → y → L(损失) +\end{enumerate} 反向传播(计算梯度): + +\begin{lstlisting} ∂L/∂y → ∂L/∂h₂ → ∂L/∂h₁ → ∂L/∂x(每步用链式法则) \end{lstlisting} 链式法则的具体形式: -\[\frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial h_2} \cdot \frac{\partial h_2}{\partial h_1} \cdot \frac{\partial h_1}{\partial W_1}\] +\[\frac{\partial L}{\partial W_{1}} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial h_{2}} \cdot \frac{\partial h_{2}}{\partial h_{1}} \cdot \frac{\partial h_{1}}{\partial W_{1}}\] -\textbf{训练循环的四个步骤} +\subsubsection{训练循环的四个步骤} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 前向传播:用当前参数计算预测值 y = f(x; θ) +\item + 计算损失:比较预测值与真实值 L = loss(y, ŷ) +\item + 反向传播:计算损失对所有参数的梯度 ∂L/∂θ +\item + 参数更新:沿梯度反方向更新参数 θ = θ - α·∂L/∂θ +\end{enumerate} \begin{lstlisting} -1. 前向传播:用当前参数计算预测值 y = f(x; θ) -2. 计算损失:比较预测值与真实值 L = loss(y, ŷ) -3. 反向传播:计算损失对所有参数的梯度 ∂L/∂θ -4. 参数更新:沿梯度反方向更新参数 θ = θ - α·∂L/∂θ - 重复以上步骤,直到损失不再显著下降(收敛) \end{lstlisting} -\textbf{Python代码示例:完整的训练循环} +\subsubsection{Python代码示例:完整的训练循环} -\begin{lstlisting}[language=Python] -import numpy as np +\textbf{import} numpy \textbf{as} np + +\emph{\# ===== 1. 准备数据 =====} + +\emph{\# 模拟数据:用y = 2x₁ + 3x₂ + 1生成} -# ===== 1. 准备数据 ===== -# 模拟数据:用y = 2x₁ + 3x₂ + 1生成 np.random.seed(42) -X = np.random.randn(100, 2) # 100个样本,2个特征 -y_true = 2 * X[:, 0:1] + 3 * X[:, 1:2] + 1 # 真实值 -y_true += np.random.normal(0, 0.1, y_true.shape) # 加入噪声 -# ===== 2. 初始化参数 ===== -W = np.random.randn(2, 1) * 0.01 # 权重 (2, 1) +\begin{enumerate} +\def\labelenumi{\roman{enumi}.} +\setcounter{enumi}{10} +\item + X = np.random.randn(100, 2) \emph{\# 100个样本,2个特征} +\item + \_true = 2 * X{[}:, 0:1{]} + 3 * X{[}:, 1:2{]} + 1 \emph{\# 真实值} +\end{enumerate} + +y\_true += np.random.normal(0, 0.1, y\_true.shape) \emph{\# 加入噪声} + +\emph{\# ===== 2. 初始化参数 =====} + +W = np.random.randn(2, 1) * 0.01 \emph{\# 权重 (2, 1)} + +\begin{lstlisting} b = np.zeros((1, 1)) # 偏置 (1, 1) learning_rate = 0.01 # 学习率 +\end{lstlisting} -# ===== 3. 训练循环 ===== -for epoch in range(500): - # 前向传播 - y_pred = np.dot(X, W) + b # 线性变换: z = Wx + b +\emph{\# ===== 3. 训练循环 =====} - # 计算损失(均方误差) - loss = np.mean((y_pred - y_true) ** 2) +\textbf{for} epoch \textbf{in} range(500): - # 反向传播(计算梯度) - dL_dy = 2 * (y_pred - y_true) / len(X) # 损失对输出的梯度 - dL_dW = np.dot(X.T, dL_dy) # 损失对W的梯度 - dL_db = np.sum(dL_dy, axis=0, keepdims=True) # 损失对b的梯度 +\emph{\# 前向传播} - # 参数更新(梯度下降) - W = W - learning_rate * dL_dW - b = b - learning_rate * dL_db +y\_pred = np.dot(X, W) + b \emph{\# 线性变换: z = Wx + b} - # 每100轮打印一次 - if (epoch + 1) % 100 == 0: - print(f"第 {epoch+1:3d} 轮 | 损失: {loss:.6f} " - f"| W: [{W[0,0]:.4f}, {W[1,0]:.4f}] | b: {b[0,0]:.4f}") +\emph{\# 计算损失(均方误差)} -print(f"\n学到的参数: W = {W.flatten()}, b = {b.flatten()}") +loss = np.mean((y\_pred - y\_true) ** 2) + +\emph{\# 反向传播(计算梯度)} + +dL\_dy = 2 * (y\_pred - y\_true) / len(X) \emph{\# 损失对输出的梯度} + +dL\_dW = np.dot(X.T, dL\_dy) \emph{\# 损失对W的梯度} + +dL\_db = np.sum(dL\_dy, axis=0, keepdims=True) \emph{\# 损失对b的梯度} + +\emph{\# 参数更新(梯度下降)} + +W = W - learning\_rate * dL\_dW + +b = b - learning\_rate * dL\_db + +\emph{\# 每100轮打印一次} + +\textbf{if} (epoch + 1) \% 100 == 0: + +print(f"第 \{epoch+1:3d\} 轮 \textbar{} 损失: \{loss:.6f\} " + +f"\textbar{} W: {[}\{W{[}0,0{]}:.4f\}, \{W{[}1,0{]}:.4f\}{]} \textbar{} +b: \{b{[}0,0{]}:.4f\}") + +print(f"\textbackslash n学到的参数: W = \{W.flatten()\}, b = +\{b.flatten()\}") + +\begin{lstlisting} print(f"真实参数: W = [2.0, 3.0], b = [1.0]") \end{lstlisting} 输出示例: -\begin{lstlisting} -第 100 轮 | 损失: 0.352148 | W: [1.5234, 2.3456] | b: 0.8765 -第 200 轮 | 损失: 0.053421 | W: [1.8765, 2.8234] | b: 0.9654 -第 300 轮 | 损失: 0.008756 | W: [1.9654, 2.9567] | b: 0.9932 -第 400 轮 | 损失: 0.001543 | W: [1.9923, 2.9891] | b: 0.9987 -第 500 轮 | 损失: 0.000287 | W: [1.9985, 2.9978] | b: 0.9997 - -学到的参数: W = [1.9985, 2.9978], b = [0.9997] -真实参数: W = [2.0, 3.0], b = [1.0] -\end{lstlisting} +第 100 轮 \textbar{} 损失: 0.352148 \textbar{} W: {[}1.5234, 2.3456{]} +\textbar{} b: 0.8765\\ +第 200 轮 \textbar{} 损失: 0.053421 \textbar{} W: {[}1.8765, 2.8234{]} +\textbar{} b: 0.9654\\ +第 300 轮 \textbar{} 损失: 0.008756 \textbar{} W: {[}1.9654, 2.9567{]} +\textbar{} b: 0.9932\\ +第 400 轮 \textbar{} 损失: 0.001543 \textbar{} W: {[}1.9923, 2.9891{]} +\textbar{} b: 0.9987\\ +第 500 轮 \textbar{} 损失: 0.000287 \textbar{} W: {[}1.9985, 2.9978{]} +\textbar{} b: 0.9997\\ +\strut \\ +学到的参数: W = {[}1.9985, 2.9978{]}, b = {[}0.9997{]}\\ +真实参数: W = {[}2.0, 3.0{]}, b = {[}1.0{]} 可以看到,经过500轮训练,模型学到的参数已经非常接近真实值。 @@ -811,7 +954,6 @@ print(f"真实参数: W = [2.0, 3.0], b = [1.0]") \begin{enumerate} \def\labelenumi{\arabic{enumi}.} -\tightlist \item \textbf{参数量爆炸}:处理高维输入(如高清图像)时,全连接导致参数量过大 \item @@ -824,190 +966,162 @@ print(f"真实参数: W = [2.0, 3.0], b = [1.0]") 正是这些局限性,催生了后续的CNN(处理图像)、RNN(处理序列)、Transformer(处理通用序列)等更专业的架构。但它们的底层原理都与MLP一脉相承。 +\section{环境-智能体框架} -\section{环境-智能体-任务:AI实践的三元框架} +\subsection{智能体与环境概念} -\subsection{学习目标} +在《人工智能——计算Agent基础》一书(普尔等,2015)中,人工智能被定义为“一个研究能够产生智能行为的计算Agent的分析与综合的领域”,可见Agent这一概念在AI领域中的核心地位。书中进一步将Agent定义为“在某个环境中进行某种行为的个体——它完成了某件事”。由此,``人工智能的核心科学目标是理解自然系统或人工系统中一些智能行为的原理“,而”人工智能的核心工程目标是设计和合成有用且智能的产品''。 -\begin{itemize} -\tightlist -\item - 理解“环境-智能体-任务”三元框架 -\item - 认识环境配置是AI实践中的关键瓶颈 -\item - 掌握降低环境门槛的实用策略 -\item - 了解推荐的学习资源与平台 -\end{itemize} +因此,AI领域的基本要素便是在不同类型环境(Environment)中行动的各类智能体(Agent),执行从科学发现到实践应用等不同场景中的多种任务(Task)。总体上,环境可分为物理环境与虚拟或数字环境两大类,智能体可分为人类(含具有不同程度智能的动物)、AI与具身智能三大类(表2.1)。 -\subsection{三元框架的提出} - -学习AI技术可以抽象为一个三元交互模型:\textbf{环境(Environment)--- 智能体(Agent)--- 任务(Task)}。 - -\begin{lstlisting} -┌──────────────────────────────────────────────────┐ -│ │ -│ ┌──────────┐ 执行任务 ┌──────────┐ │ -│ │ 智能体 │ ──────────────→ │ 任务 │ │ -│ │ (Agent) │ ←────────────── │ (Task) │ │ -│ │ │ 返回结果 │ │ │ -│ └────┬─────┘ └──────────┘ │ -│ │ 感知 │ │ -│ ▼ │ │ -│ ┌──────────┐ │ │ -│ │ 环境 │ ◄───────────────────┘ │ -│ │(Environ.)│ 环境反馈 │ -│ └──────────┘ │ -│ │ -└──────────────────────────────────────────────────┘ -\end{lstlisting} - -三个要素的含义: - -{\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1935}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1935}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.6129}}@{}} + >{\centering\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1442}} + >{\centering\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4327}} + >{\centering\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4135}}@{}} +\caption{表 2.1 环境-智能体的类型组合}\tabularnewline \toprule\noalign{} -\begin{minipage}[b]{\linewidth}\raggedright -要素 -\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright -含义 -\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright -AI学习中的具体体现 -\end{minipage} \\ -\midrule\noalign{} +\endfirsthead \endhead \bottomrule\noalign{} \endlastfoot -\textbf{环境} & 智能体所处的操作空间 & Python环境、GPU资源、数据集、网络连接 \\ -\textbf{智能体} & 执行任务的学习者 & 设计专业学生、设计师、研究人员 \\ -\textbf{任务} & 需要完成的目标 & 运行一个CNN分类器、训练一个生成模型、部署一个Agent \\ +\textbf{环境} + +\textbf{智能体} & \textbf{物理环境} & \textbf{数字环境} \\ +\textbf{人类} & ~ 具有物理身体,能直接感知和互动 & ~ +通过设备(如电脑、手机)访问,依赖界面 \\ +\textbf{AI} & ~ 通过机器人或嵌入式系统体现,但本质是软件 & ~ +主要存在和运行,如算法、聊天机器人 \\ +\textbf{具身智能} & ~ 设计用于物理世界,有传感器和执行器 & ~ +可能具有数字组件,但焦点是物理体现 \\ \end{longtable} -} -这个框架不仅适用于强化学习中的智能体(见第6章),也适用于\textbf{人类学习AI的过程}:学习者(智能体)需要在一个合适的环境(计算环境)中完成学习任务。 +其中,人类与物理环境的互动长久以来是地理学科的研究主题,即“人地关系”或“人地耦合系统”研究,涉及环境感知、景观设计、可持续性等多个议题。当前的“智能体---环境”关系研究可视为“人地关系”研究的自然延伸,可从中汲取丰富启发,有待后续深入探讨。人类与数字环境的互动则关联网络社会、人机交互等主题,在AI蓬勃发展的时代背景下催生了更多、更深刻的研究命题。AI与具身智能分别对应数字环境和物理环境,构成了人工智能的两种主要存在方式。 -\subsection{环境配置:被忽视的瓶颈} +需要指出的是,某些非生物的自然过程(如景观中的风雨侵蚀)以及人类社会经济变迁等现象,同样可以采用Agent方法加以研究,即所谓的ABM建模。不过,此处的Agent并非智能体概念,而是指基于个体的建模方法。然而,大模型技术在ABM领域的引入正在模糊这一边界。 -对于计算机专业的学生,搭建Python环境、安装PyTorch、下载预训练模型可能只是日常操作。但对于\textbf{设计专业学生}而言,环境配置往往成为学习AI的最大障碍: +\subsection{行为主义视角下的“环境-智能体”} + +在人工智能的行为主义流派视角下,人工智能问题可抽象为一个三元交互模型:\textbf{环境(Environment)--- +智能体(Agent)--- +任务(Task)}。特定架构的智能体对所处环境执行某个动作(Action),基于对环境的感知与结果的观察(Observation),获得该动作所产生的奖励(Reward),继而不断重复这一过程以优化决策策略,直到较好地完成某个或多个任务(Task)(图2.1)。该框架不仅适用于强化学习中的智能体(见第8章),也适用于\textbf{人类学习的普遍过程}。 + +\begin{figure} +\centering +\includegraphics[width=4.15529in,height=3.58481in,alt={图 2.1 智能体-环境互动框架}]{figures/ch02/image1.png} +\caption{图 2.1 智能体-环境互动框架} +\end{figure} + +\subsection{"环境-智能体"框架与设计任务} + +学习AI技术可以抽象为一个三元交互模型:\textbf{环境(Environment)--- +智能体(Agent)--- 任务(Task)}。 + +\subsection{智能系统的设计空间:复杂性维度} + +Agent在环境中的行为充满复杂性,这些复杂性可以分解为不同的维度从而便于理解和分析;这些维度也构成了人工智能系统的设计空间,通过改变不同维度的值可以得到空间里的不同的点,从而有效构建满足特定任务求解的智能系统(普尔等,2015)。 + +从复杂性维度出发,讨论如下9个维度的复杂性及其在设计领域的体现,即模块性、表示方案、规划期、感知不确定性、效用不确定性、偏好、Agent数量、学习以及计算限制(表 +2.2)。 + +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.2083}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.5694}}@{}} +\caption{表 2.2 智能系统设计空间的复杂性维度}\tabularnewline +\toprule\noalign{} +\endfirsthead +\endhead +\bottomrule\noalign{} +\endlastfoot +\textbf{维度} & \textbf{值} \\ +模块性 & 扁平的、模块化的、分层的 \\ +表示方案 & 状态、特征、关系 \\ +规划期 & 无规划、有限阶段、不确定阶段、无限阶段 \\ +感知不确定性 & 完全可观察、部分可观察 \\ +效用不确定性 & 确定性的、随机的 \\ +偏好 & 目标、复杂偏好 \\ +学习 & 已知的知识、学到的知识 \\ +Agent 数量 & 单个 Agent、多 Agent \\ +计算限制 & 完全理性、有限理性 \\ +\end{longtable} + +来源:引自参考文献(普尔等,2015) + +\section{思考与练习} + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + \textbf{函数思维练习}:请列举3个设计领域中的例子,说明它们可以用函数 + \(y = f(x;\theta)\) 来描述。思考输入 \(x\)、输出 \(y\) + 和需要学习的参数 \(\theta\) 分别是什么。 +\item + \textbf{模态映射练习}:选择一个你熟悉的设计项目(如建筑设计、产品设计或平面设计),分析该项目涉及哪些数据模态(一维/二维/三维/决策/生成/行动),以及每种模态在该项目中的作用。 +\item + \textbf{演进规律思考}:回顾2.3节中介绍的四个发展阶段。在你关注的设计领域,AI技术目前处于哪个阶段?未来会如何演进?请给出你的分析和理由。 +\item + \textbf{环境-智能体-任务练习}:规划你的AI学习路径。评估你当前的计算环境(笔记本配置、网络条件),选择最适合你的入门策略(云端/本地/Vibe + Coding),并设定一个本周可完成的小任务(如在Colab上运行一个图像分类示例)。 +\end{enumerate} + +\textbf{(1)环境配置:被忽视的瓶颈} + +对于计算机专业的学生,搭建Python环境、安装PyTorch、下载预训练模型可能只是日常操作。但对于\textbf{设计专业学生}而言,环境配置往往成为学习AI的最大障碍,可能在多个步骤均遭遇问题。 -\begin{lstlisting} 设计学生尝试运行一个图像分类示例: - 1. 安装Python → 版本冲突(3.8? 3.9? 3.11?) - 2. 安装pip包 → 权限报错 / 网络超时 - 3. pip install torch → 下载2GB,断线重连3次 - 4. 下载预训练权重 → 需要HuggingFace账号 / 网络限制 - 5. CUDA版本不匹配 → "torch.cuda.is_available() = False" - 6. import cv2报错 → 缺少系统依赖 - 7. 终于跑通 → 已经精疲力竭,失去了学习兴趣 -\end{lstlisting} +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 安装Python → 版本冲突(3.8? 3.9? 3.11?) +\item + 安装pip包 → 权限报错 / 网络超时 +\item + pip install torch → 下载2GB,断线重连3次 +\item + 下载预训练权重 → 需要HuggingFace账号 / 网络限制 +\item + CUDA版本不匹配 → "torch.cuda.is\_available() = False" +\item + import cv2报错 → 缺少系统依赖 +\item + 终于跑通 → 耗费大量时间,已经精疲力竭 +\end{enumerate} -\textbf{典型痛点清单}: +环境问题不是“技术能力不足”,而是\textbf{基础设施鸿沟}。正如设计师不需要理解CAD软件的底层渲染引擎才能画图,学习AI也不应该被环境配置阻挡在门外。 -{\def\LTcaptype{none} % do not increment counter -\begin{longtable}[]{@{}lll@{}} -\toprule\noalign{} -痛点 & 具体表现 & 严重程度 \\ -\midrule\noalign{} -\endhead -\bottomrule\noalign{} -\endlastfoot -Python版本管理 & 多版本共存导致路径混乱 & ★★★★ \\ -包依赖冲突 & numpy版本不兼容PyTorch & ★★★★ \\ -GPU/CUDA配置 & 驱动版本与CUDA版本不匹配 & ★★★★★ \\ -数据下载 & 大型数据集下载慢、需要代理 & ★★★★ \\ -网络环境 & HuggingFace/Google Colab访问受限 & ★★★★ \\ -系统差异 & Windows/Mac/Linux命令不同 & ★★★ \\ -内存不足 & 本地机器无法运行大模型 & ★★★★ \\ -\end{longtable} -} +\textbf{(2)解决策略} -\begin{quote} -\textbf{核心观点}:环境问题不是“技术能力不足”的问题,而是\textbf{基础设施鸿沟}。正如设计师不需要理解CAD软件的底层渲染引擎才能画图,学习AI也不应该被环境配置阻挡在门外。 -\end{quote} - -\subsection{降低门槛的实践策略} - -针对以上痛点,推荐以下策略: - -\textbf{策略一:使用云端开发环境} - -{\def\LTcaptype{none} % do not increment counter -\begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2222}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2222}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.3333}} - >{\raggedright\arraybackslash}p{(\linewidth - 6\tabcolsep) * \real{0.2222}}@{}} -\toprule\noalign{} -\begin{minipage}[b]{\linewidth}\raggedright -平台 -\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright -特点 -\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright -适用场景 -\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright -费用 -\end{minipage} \\ -\midrule\noalign{} -\endhead -\bottomrule\noalign{} -\endlastfoot -Google Colab & 免费GPU、即开即用 & 快速实验、课程练习 & 免费/Pro版\$10/月 \\ -Kaggle Notebooks & 免费GPU、数据集内置 & 竞赛学习、数据分析 & 免费 \\ -阿里云天池 & 国内访问快、中文社区 & 国内课程、中文教程 & 免费额度 \\ -AutoDL / 矩池云 & 国内GPU租用 & 训练大模型、长时间训练 & 按量计费 \\ -\end{longtable} -} - -\textbf{策略二:使用Vibe Coding工具链} - -本书附录2详细介绍了Vibe Coding(感觉驱动编程)的理念和工具链。核心思想是:\textbf{让AI辅助编程,降低代码编写的门槛}。 +本书附录2详细介绍了Vibe +Coding(感觉驱动编程)的理念和工具链。核心思想是:\textbf{让AI辅助编程,降低代码编写的门槛}。 \begin{itemize} -\tightlist \item \textbf{Claude Code}:用自然语言描述需求,AI自动生成代码 \item \textbf{Cursor / GitHub Copilot}:IDE内AI辅助编程 -\item - \textbf{Jupyter Notebook}:交互式编程,所见即所得 \end{itemize} -\textbf{策略三:使用容器化环境} +此外,云端与容器化环境可以免配置直接上手。云端方面:Google +Colab提供免费GPU/TPU算力,适合快速实验与教学演示;Kaggle +Notebooks集成竞赛数据集与社区代码,便于参考与复现;阿里云天池面向国内用户,提供稳定算力与本地化资源。容器化方面:Docker将运行环境打包为镜像,一次构建、到处运行,彻底告别“It +works on my machine”的环境差异问题。 -\begin{lstlisting}[language=bash] -# 一行命令启动预配置的AI开发环境(需安装Docker) -docker run -it -p 8888:8888 pytorch/pytorch:latest +\section{延伸阅读} -# 或使用 conda 快速创建隔离环境 -conda create -n ai-design python=3.10 -conda activate ai-design -conda install pytorch torchvision -c pytorch -\end{lstlisting} - -容器化确保环境一致性——一次配置,到处运行。 - -\textbf{策略四:渐进式学习路径} - -\begin{lstlisting} -零门槛入门 进阶实践 深度开发 -───────────────────────────────────────────────────── -Google Colab → 本地Python环境 → GPU服务器 -自然语言编程 → Vibe Coding → 原生代码编写 -在线Notebook → Jupyter本地 → IDE (VSCode) -调用API → 加载预训练模型 → 微调训练 -小数据集实验 → 设计数据集构建 → 大规模训练 -\end{lstlisting} - -\begin{quote} -\textbf{建议}:初学阶段不必强求本地环境配置完整。先在云端环境跑通案例、建立直觉,再逐步搭建本地环境。 -\end{quote} - -\subsection{推荐学习资源} +\begin{itemize} +\item + \href{http://neuralnetworksanddeeplearning.com/}{Neural Networks and + Deep Learning} --- Michael Nielsen 的在线教材,直观讲解神经网络原理 +\item + \href{https://arxiv.org/abs/2001.08361}{Scaling Laws for Neural + Language Models} --- Kaplan et al., 2020,Scaling Law 的经典论文 +\item + \href{https://arxiv.org/abs/2108.07258}{On the Opportunities and Risks + of Foundation Models} --- Stanford HAI 报告,全面介绍基础模型 +\item + \href{https://www.youtube.com/watch?v=aircAruvnKk}{3Blue1Brown: But + what is a Neural Network?} --- 优秀的神经网络可视化讲解视频 +\end{itemize} 以下资源可以作为本章和后续章节的补充学习材料: @@ -1015,9 +1129,9 @@ Google Colab → 本地Python环境 → GPU服务器 {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1371}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4162}} + >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4365}}@{}} \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 资源 @@ -1030,21 +1144,35 @@ Google Colab → 本地Python环境 → GPU服务器 \endhead \bottomrule\noalign{} \endlastfoot -Datawhale Bishop DL & 基于Bishop《深度学习》的中文笔记,覆盖概率论、回归、分类、DNN、CNN、Transformer & \href{https://datawhalechina.github.io/dive-into-bishop-dl/}{dive-into-bishop-dl} \\ -Ai-learn & 完整的AI学习路线图,从数学基础到深度学习实战 & \href{https://github.com/tangyudi/Ai-learn}{Ai-learn} \\ -3Blue1Brown 神经网络 & 顶级可视化讲解,建立直觉理解 & \href{https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi}{YouTube} \\ -李宏毅机器学习 & 中文讲解,理论与应用并重 & \href{https://www.youtube.com/c/HungyiLeeNTU}{YouTube} \\ -fast.ai & 顶向下教学,先实践后理论 & \href{https://course.fast.ai/}{course.fast.ai} \\ -d2l.ai(动手学深度学习) & 代码驱动,PyTorch/MXNet/TensorFlow多框架 & \href{https://d2l.ai/}{d2l.ai} \\ +Datawhale Bishop DL & +基于Bishop《深度学习》的中文笔记,覆盖概率论、回归、分类、DNN、CNN、Transformer +& +\href{https://datawhalechina.github.io/dive-into-bishop-dl/}{dive-into-bishop-dl} \\ +Ai-learn & 完整的AI学习路线图,从数学基础到深度学习实战 & +\href{https://github.com/tangyudi/Ai-learn}{Ai-learn} \\ +3Blue1Brown 神经网络 & 顶级可视化讲解,建立直觉理解 & +\href{https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi}{YouTube} \\ +李宏毅机器学习 & 中文讲解,理论与应用并重 & +\href{https://www.youtube.com/c/HungyiLeeNTU}{YouTube} \\ +fast.ai & 顶向下教学,先实践后理论 & +\href{https://course.fast.ai/}{course.fast.ai} \\ +d2l.ai(动手学深度学习) & 代码驱动,PyTorch/MXNet/TensorFlow多框架 & +\href{https://d2l.ai/}{d2l.ai} \\ \end{longtable} } \textbf{设计领域AI资源} {\def\LTcaptype{none} % do not increment counter -\begin{longtable}[]{@{}ll@{}} +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.2639}} + >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.5139}}@{}} \toprule\noalign{} -资源 & 说明 \\ +\begin{minipage}[b]{\linewidth}\raggedright +资源 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ \midrule\noalign{} \endhead \bottomrule\noalign{} @@ -1055,81 +1183,5 @@ Papers With Code & 论文+代码+排行榜,追踪最新技术 \\ \end{longtable} } -\begin{quote} -\textbf{学习方法建议}:不要试图一次性学完所有资源。根据当前章节的学习进度,选择1-2个配套资源即可。例如,学习第3章(Transformer)时,可以对照 Datawhale Bishop DL 中对应的章节加深理解。 -\end{quote} - - -\section{思考与练习} - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\item - \textbf{函数思维练习}:请列举3个设计领域中的例子,说明它们可以用函数 \(y = f(x; \theta)\) 来描述。思考输入 \(x\)、输出 \(y\) 和需要学习的参数 \(\theta\) 分别是什么。 -\item - \textbf{模态映射练习}:选择一个你熟悉的设计项目(如建筑设计、产品设计或平面设计),分析该项目涉及哪些数据模态(一维/二维/三维/决策/生成/行动),以及每种模态在该项目中的作用。 -\item - \textbf{演进规律思考}:回顾2.3节中介绍的四个发展阶段。在你关注的设计领域,AI技术目前处于哪个阶段?未来会如何演进?请给出你的分析和理由。 -\item - \textbf{环境-智能体-任务练习}:规划你的AI学习路径。评估你当前的计算环境(笔记本配置、网络条件),选择最适合你的入门策略(云端/本地/Vibe Coding),并设定一个本周可完成的小任务(如在Colab上运行一个图像分类示例)。 -\end{enumerate} - - -\section{关键术语} - -{\def\LTcaptype{none} % do not increment counter -\begin{longtable}[]{@{} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}} - >{\raggedright\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.3333}}@{}} -\toprule\noalign{} -\begin{minipage}[b]{\linewidth}\raggedright -中文 -\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright -英文 -\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright -说明 -\end{minipage} \\ -\midrule\noalign{} -\endhead -\bottomrule\noalign{} -\endlastfoot -数据模态 & Data Modality & 信息的存在形式,如文本、图像、三维等 \\ -线性回归 & Linear Regression & \(y = ax + b\) 形式的函数拟合 \\ -多元回归 & Multiple Regression & 多输入变量的线性模型 \(y = \sum a_ix_i + b\) \\ -多层感知机 & Multi-Layer Perceptron (MLP) & 最基础的前馈神经网络结构 \\ -前向传播 & Forward Propagation & 数据从输入层到输出层的计算过程 \\ -激活函数 & Activation Function & 引入非线性的函数,如ReLU、Sigmoid \\ -损失函数 & Loss Function & 衡量预测值与真实值差距的函数 \\ -反向传播 & Backpropagation & 利用链式法则计算梯度的算法 \\ -梯度下降 & Gradient Descent & 沿梯度反方向更新参数的优化方法 \\ -学习率 & Learning Rate & 梯度下降中控制参数更新步长的超参数 \\ -权重 & Weight & 神经元之间连接的可学习参数 \\ -偏置 & Bias & 调整输出基准的可学习参数 \\ -特征工程 & Feature Engineering & 人工设计和提取数据特征的过程 \\ -迁移学习 & Transfer Learning & 将一个任务学到的知识迁移到新任务 \\ -基础模型 & Foundation Model & 在大规模数据上预训练的大型通用模型 \\ -涌现能力 & Emergent Abilities & 模型规模大到一定程度后出现的新能力 \\ -缩放定律 & Scaling Law & 模型性能与规模(数据量、参数量、计算量)之间的关系规律 \\ -环境-智能体-任务 & Environment-Agent-Task & AI实践的三元框架:环境提供操作空间,智能体执行任务,任务定义目标 \\ -Vibe Coding & Vibe Coding & 感觉驱动编程,用自然语言描述需求让AI生成代码的编程范式 \\ -全连接层 & Fully Connected Layer & 每个神经元与上一层所有神经元相连的网络层 \\ -预训练 & Pre-training & 在大规模数据上的初始训练阶段 \\ -微调 & Fine-tuning & 在特定任务数据上对预训练模型进行适配训练 \\ -\end{longtable} -} - - -\section{延伸阅读} - -\begin{itemize} -\tightlist -\item - \href{http://neuralnetworksanddeeplearning.com/}{Neural Networks and Deep Learning} --- Michael Nielsen 的在线教材,直观讲解神经网络原理 -\item - \href{https://arxiv.org/abs/2001.08361}{Scaling Laws for Neural Language Models} --- Kaplan et al., 2020,Scaling Law 的经典论文 -\item - \href{https://arxiv.org/abs/2108.07258}{On the Opportunities and Risks of Foundation Models} --- Stanford HAI 报告,全面介绍基础模型 -\item - \href{https://www.youtube.com/watch?v=aircAruvnKk}{3Blue1Brown: But what is a Neural Network?} --- 优秀的神经网络可视化讲解视频 -\end{itemize} +\textbf{学习方法建议}:不要试图一次性学完所有资源。根据当前章节的学习进度,选择1-2个配套资源即可。例如,学习第3章(Transformer)时,可以对照 +Datawhale Bishop DL 中对应的章节加深理解。 diff --git a/chapters/ch13-conclusion.tex b/chapters/ch13-conclusion.tex new file mode 100644 index 0000000..d2f8be3 --- /dev/null +++ b/chapters/ch13-conclusion.tex @@ -0,0 +1,49 @@ +\chapter{结语与展望} + +\section{回顾:从原理到实践} + +回顾全书,我们从两个维度展开了设计人工智能的探索。 + +\textbf{上篇}聚焦技术原理。我们从AI的发展历程出发,理解了神经网络的函数式本质——通过函数组合逼近任意复杂的映射关系。在此基础上,沿着数据模态的主线,依次探讨了:一维序列数据与自然语言处理(RNN、Transformer、大语言模型),二维图像与计算机视觉(CNN、ViT),三维空间与空间智能(PointNet、3D重建)。进而,我们学习了生成式AI(VAE、GAN、扩散模型)如何从数据中学习分布并创造新内容,AI Agent如何将感知、推理与行动闭环整合,以及强化学习如何通过试错与反馈优化策略。 + +这些技术并非孤立的模块,而是构成了一个完整的智能系统架构:感知引擎理解世界,生成引擎创造可能,推理引擎做出决策,而强化学习提供了持续改进的机制。 + +\textbf{下篇}转向设计实践。我们看到AI已经在数字媒体、工业设计、环境景观、城市规划与生态设计等领域展现出强大的应用潜力。每个领域都有其独特的数据特征、评估标准和决策逻辑,AI的价值不在于替代设计师,而在于扩展设计师的能力边界——处理更大规模的数据、探索更广阔的方案空间、做出更精准的评估判断。 + +\section{核心洞见} + +贯穿全书,有几个核心观点值得再次强调: + +\textbf{理解原理比掌握工具更重要。}工具和平台层出不穷、快速迭代,但背后的原理——函数逼近、注意力机制、扩散过程、策略优化——具有持久的价值。掌握了原理,面对任何新工具都能快速上手;反之,仅停留在工具操作层面,则永远只能被动跟随。 + +\textbf{数据和问题定义是关键。}AI的效果高度依赖于数据质量和问题定义的清晰程度。在设计领域,这意味着需要认真思考:我们要解决什么问题?用什么数据来训练和评估?如何定义"好设计"?这些问题往往比模型选择更为重要。 + +\textbf{人机协作是正确的方向。}AI擅长处理大规模数据、快速生成方案、进行穷举搜索;人类擅长理解语境、做出价值判断、处理模糊和矛盾的需求。两者的结合,而非相互替代,才能产生最大的价值。 + +\section{展望:设计智能的未来} + +站在2026年的时间节点上,设计人工智能正在经历从"工具辅助"到"智能协同"的转变。以下几个方面值得关注: + +\textbf{多模态融合}。未来的设计AI将不再局限于单一模态,而是能够同时理解文本、图像、三维模型、空间数据等多种信息,形成对设计任务的全面理解。这将使得设计师能够以更自然的方式与AI交互——用草图、语言、手势等多种方式表达设计意图。 + +\textbf{自主设计探索}。随着AI Agent技术的成熟,AI将从被动执行指令的工具,进化为能够主动提出设计方案、自主评估优化、甚至发现人类未曾想到的解决方案的设计伙伴。设计师的角色将更多地转向目标定义、约束设定和质量把关。 + +\textbf{设计知识的系统化}。长期以来,设计知识高度依赖个人经验和隐性知识,难以系统化传承。AI有望通过学习海量的设计案例,将设计知识显性化、结构化,使设计经验能够被更广泛地共享和复用。 + +\textbf{伦理与可持续性}。AI在设计中的应用必须考虑伦理和社会影响——算法偏见、知识产权、就业影响、能源消耗等问题都需要认真对待。可持续设计不应仅停留在概念层面,而应融入AI辅助设计的每一个环节。 + +\textbf{设计教育的变革}。设计教育需要重新思考课程体系,在保持设计思维和美学素养培养的同时,融入计算思维和数据素养的训练。未来的设计师需要既懂设计,又理解AI,还能在两者之间架起桥梁。 + +\section{致读者} + +设计的人工智能时代才刚刚拉开序幕。这本书所涵盖的内容,与其说是对这一领域的完整总结,不如说是一份邀请——邀请你走进这个充满可能性的领域,用自己的专业视角去发现问题、定义问题、解决问题。 + +无论你是设计专业的学生、教师,还是从业设计师,希望你从这本书中获得的不只是一些技术知识,更是一种思维方式:用计算的视角理解设计,用设计的智慧引导技术。 + +技术在变,工具在变,但设计服务于人的本质不会变。愿你在AI时代,成为更好的设计师。 + +\begin{flushright} +彭晓 + +2026年4月25日 +\end{flushright} diff --git a/chapters/divider-lower.tex b/chapters/divider-lower.tex new file mode 100644 index 0000000..0f4911d --- /dev/null +++ b/chapters/divider-lower.tex @@ -0,0 +1,2 @@ +\chapter*{下篇:设计领域应用} +\addcontentsline{toc}{chapter}{下篇:设计领域应用} diff --git a/chapters/divider-upper.tex b/chapters/divider-upper.tex new file mode 100644 index 0000000..a787c71 --- /dev/null +++ b/chapters/divider-upper.tex @@ -0,0 +1,2 @@ +\chapter*{上篇:原理与技术} +\addcontentsline{toc}{chapter}{上篇:原理与技术} diff --git a/main.tex b/main.tex index 3263f76..1f4ca58 100644 --- a/main.tex +++ b/main.tex @@ -28,6 +28,7 @@ \mainmatter % 上篇:原理与技术 +\input{chapters/divider-upper} \input{chapters/ch01-intro} \input{chapters/ch02-framework} \input{chapters/ch03-1d-sequence} @@ -38,11 +39,15 @@ \input{chapters/ch08-rl} % 下篇:设计领域应用 +\input{chapters/divider-lower} \input{chapters/ch09-digital-media} \input{chapters/ch10-industrial} \input{chapters/ch11-environment} \input{chapters/ch12-urban} +% 结语 +\input{chapters/ch13-conclusion} + % ---------- 附录部分 ---------- \appendix \input{appendices/ap00-divider} From 89c038b1c45eade409e10eaeae6aa3edc8f6c440 Mon Sep 17 00:00:00 2001 From: xiaopeng <1509442308@qq.com> Date: Fri, 29 May 2026 15:40:52 +0800 Subject: [PATCH 7/9] =?UTF-8?q?feat(latex):=20=E9=85=8D=E7=BD=AE=20natbib?= =?UTF-8?q?=20=E5=8F=82=E8=80=83=E6=96=87=E7=8C=AE=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=B9=B6=E6=8F=92=E5=85=A5=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 DesignAI.bib(Garrity + 普尔等 2 条) - preamble 添加 natbib + plainnat 样式 - ch01/ch02 插入 \cite 引用(共 5 处) - 参考文献加入目录 outline(\addcontentsline) - 删除 ap07-references.tex,由 \bibliography 自动生成 Co-Authored-By: Claude Opus 4.7 --- DesignAI.bib | 20 ++++++++++++++++++++ appendices/ap07-references.tex | 3 --- chapters/ch01-intro.tex | 2 +- chapters/ch02-framework.tex | 8 ++++---- main.tex | 5 ++++- preamble.tex | 4 ++++ 6 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 DesignAI.bib delete mode 100644 appendices/ap07-references.tex diff --git a/DesignAI.bib b/DesignAI.bib new file mode 100644 index 0000000..5af400a --- /dev/null +++ b/DesignAI.bib @@ -0,0 +1,20 @@ +@book{EJUUCH39, + title = {All the Math You Missed: But Need to Know for Graduate School}, + author = {Thomas A. Garrity}, + edition = {2}, + year = {2017}, + publisher = {Cambridge University Press}, + langid = {english} +} + +@book{MGDW8DPN, + title = {人工智能:计算agent基础}, + author = {David L. Poole and Alan K. Mackworth}, + translator = {董红斌 and 董兴业 and 童向荣 and 汪廷华}, + year = {2015}, + series = {计算机科学丛书}, + publisher = {机械工业出版社}, + isbn = {978-7-111-48457-8}, + langid = {chinese}, + origtitle = {Artificial Intelligence: Foundations of Computational Agents} +} diff --git a/appendices/ap07-references.tex b/appendices/ap07-references.tex deleted file mode 100644 index c681d6b..0000000 --- a/appendices/ap07-references.tex +++ /dev/null @@ -1,3 +0,0 @@ -\chapter{参考文献} - -本部分整理教材中引用的论文、书籍和在线资源。 diff --git a/chapters/ch01-intro.tex b/chapters/ch01-intro.tex index f537efb..05626b2 100644 --- a/chapters/ch01-intro.tex +++ b/chapters/ch01-intro.tex @@ -397,7 +397,7 @@ Scaling Law(缩放定律)描述了模型性能与计算量、数据量、参 \subsubsection{核心理念} -\textbf{``Functions Describe the World''(函数描述世界)}——这一理念由美国威廉姆斯学院(Williams College)数学教授 Thomas Garrity 提出。他认为数学各分支本质上都在研究不同类型的函数:代数研究多项式函数,微积分研究光滑函数,线性代数研究线性变换。而世间万物——从声波在耳膜上的振动,到光线在视网膜上的投影——都可以用函数来描述。 +\textbf{``Functions Describe the World''(函数描述世界)}——这一理念由美国威廉姆斯学院(Williams College)数学教授 Thomas Garrity 提出\cite{EJUUCH39}。他认为数学各分支本质上都在研究不同类型的函数:代数研究多项式函数,微积分研究光滑函数,线性代数研究线性变换。而世间万物——从声波在耳膜上的振动,到光线在视网膜上的投影——都可以用函数来描述。 \begin{itemize} \tightlist diff --git a/chapters/ch02-framework.tex b/chapters/ch02-framework.tex index bce2998..28b6af5 100644 --- a/chapters/ch02-framework.tex +++ b/chapters/ch02-framework.tex @@ -29,7 +29,7 @@ Modality)作为理解AI技术的组织原则,梳理从小模型到大模型 \subsection{物理定律:用函数描述世界} -正如 Garrity 在其著作 \textit{All the Math You Missed} 中所言:``The mantra that we should all chant each night before bed is: Functions Describe the World.'' 物理学是最早践行这一理念的学科。人类科学家花费数百年时间,发现了许多简洁而优美的函数关系: +正如 Garrity 在其著作 \textit{All the Math You Missed}\cite{EJUUCH39} 中所言:``The mantra that we should all chant each night before bed is: Functions Describe the World.'' 物理学是最早践行这一理念的学科。人类科学家花费数百年时间,发现了许多简洁而优美的函数关系: {\def\LTcaptype{none} % do not increment counter \begin{longtable}[]{@{} @@ -970,7 +970,7 @@ print(f"真实参数: W = [2.0, 3.0], b = [1.0]") \subsection{智能体与环境概念} -在《人工智能——计算Agent基础》一书(普尔等,2015)中,人工智能被定义为“一个研究能够产生智能行为的计算Agent的分析与综合的领域”,可见Agent这一概念在AI领域中的核心地位。书中进一步将Agent定义为“在某个环境中进行某种行为的个体——它完成了某件事”。由此,``人工智能的核心科学目标是理解自然系统或人工系统中一些智能行为的原理“,而”人工智能的核心工程目标是设计和合成有用且智能的产品''。 +在《人工智能——计算Agent基础》一书\cite{MGDW8DPN}中,人工智能被定义为“一个研究能够产生智能行为的计算Agent的分析与综合的领域”,可见Agent这一概念在AI领域中的核心地位。书中进一步将Agent定义为“在某个环境中进行某种行为的个体——它完成了某件事”。由此,``人工智能的核心科学目标是理解自然系统或人工系统中一些智能行为的原理“,而”人工智能的核心工程目标是设计和合成有用且智能的产品''。 因此,AI领域的基本要素便是在不同类型环境(Environment)中行动的各类智能体(Agent),执行从科学发现到实践应用等不同场景中的多种任务(Task)。总体上,环境可分为物理环境与虚拟或数字环境两大类,智能体可分为人类(含具有不同程度智能的动物)、AI与具身智能三大类(表2.1)。 @@ -1018,7 +1018,7 @@ print(f"真实参数: W = [2.0, 3.0], b = [1.0]") \subsection{智能系统的设计空间:复杂性维度} -Agent在环境中的行为充满复杂性,这些复杂性可以分解为不同的维度从而便于理解和分析;这些维度也构成了人工智能系统的设计空间,通过改变不同维度的值可以得到空间里的不同的点,从而有效构建满足特定任务求解的智能系统(普尔等,2015)。 +Agent在环境中的行为充满复杂性,这些复杂性可以分解为不同的维度从而便于理解和分析;这些维度也构成了人工智能系统的设计空间,通过改变不同维度的值可以得到空间里的不同的点,从而有效构建满足特定任务求解的智能系统\cite{MGDW8DPN}。 从复杂性维度出发,讨论如下9个维度的复杂性及其在设计领域的体现,即模块性、表示方案、规划期、感知不确定性、效用不确定性、偏好、Agent数量、学习以及计算限制(表 2.2)。 @@ -1044,7 +1044,7 @@ Agent 数量 & 单个 Agent、多 Agent \\ 计算限制 & 完全理性、有限理性 \\ \end{longtable} -来源:引自参考文献(普尔等,2015) +来源:引自参考文献\cite{MGDW8DPN} \section{思考与练习} diff --git a/main.tex b/main.tex index 1f4ca58..175ae8b 100644 --- a/main.tex +++ b/main.tex @@ -48,6 +48,10 @@ % 结语 \input{chapters/ch13-conclusion} +% ---------- 参考文献 ---------- +\addcontentsline{toc}{chapter}{参考文献} +\bibliography{DesignAI} + % ---------- 附录部分 ---------- \appendix \input{appendices/ap00-divider} @@ -57,7 +61,6 @@ \input{appendices/ap04-web-tools} \input{appendices/ap05-online-resources} \input{appendices/ap06-more-resources} -\input{appendices/ap07-references} \input{appendices/ap08-glossary} \input{appendices/ap09-tips} diff --git a/preamble.tex b/preamble.tex index e987faa..aab9d96 100644 --- a/preamble.tex +++ b/preamble.tex @@ -61,6 +61,10 @@ bookmarksopen=true, } +% ========== 参考文献 ========== +\usepackage[numbers,sort&compress]{natbib} +\bibliographystyle{plainnat} + % ========== 其他 ========== \usepackage{enumitem} \usepackage{tcolorbox} From 2305ae0ba6cd3b07a4fd1ac924cfb9b2e166c599 Mon Sep 17 00:00:00 2001 From: xiaopeng <1509442308@qq.com> Date: Fri, 29 May 2026 21:23:42 +0800 Subject: [PATCH 8/9] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9E=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=20README=EF=BC=8C=E6=B8=85=E7=90=86=E6=AE=8B=E7=95=99?= =?UTF-8?q?=20label=EF=BC=8C=E6=B7=BB=E5=8A=A0=20diagbox=20=E5=AE=8F?= =?UTF-8?q?=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- appendices/ap01-programming.tex | 6 +++--- chapters/ch02-framework.tex | 37 +++++++++++++-------------------- preamble.tex | 1 + 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/appendices/ap01-programming.tex b/appendices/ap01-programming.tex index fe2d08e..6348739 100644 --- a/appendices/ap01-programming.tex +++ b/appendices/ap01-programming.tex @@ -696,7 +696,7 @@ Agent开发 & LangGraph & pip install langgraph & 状态机式Agent开发 \\ \subsubsection{模型资源} \paragraph{\texorpdfstring{Hugging -Face:\href{https://huggingface.co/}{huggingface.co}}{Hugging Face:huggingface.co}}\label{hugging-facehuggingface.co} +Face:\href{https://huggingface.co/}{huggingface.co}}{Hugging Face:huggingface.co}} 功能:模型仓库、数据集、Spaces在线演示 @@ -788,7 +788,7 @@ train\_test\_split \textbf{from} sklearn.metrics \textbf{import} accuracy\_score, classification\_report -\subsubsection{}\label{section} + \emph{\# 1. 加载数据} @@ -915,7 +915,7 @@ print(f"dy/dx = \{x.grad\}") \emph{\# 应为 2x + 3 = 7(x=2时)} \textbf{from} torchvision \textbf{import} datasets, transforms -\paragraph{}\label{section-4} + \emph{\# 1. 数据准备} diff --git a/chapters/ch02-framework.tex b/chapters/ch02-framework.tex index 28b6af5..6c00092 100644 --- a/chapters/ch02-framework.tex +++ b/chapters/ch02-framework.tex @@ -974,26 +974,19 @@ print(f"真实参数: W = [2.0, 3.0], b = [1.0]") 因此,AI领域的基本要素便是在不同类型环境(Environment)中行动的各类智能体(Agent),执行从科学发现到实践应用等不同场景中的多种任务(Task)。总体上,环境可分为物理环境与虚拟或数字环境两大类,智能体可分为人类(含具有不同程度智能的动物)、AI与具身智能三大类(表2.1)。 -\begin{longtable}[]{@{} - >{\centering\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.1442}} - >{\centering\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4327}} - >{\centering\arraybackslash}p{(\linewidth - 4\tabcolsep) * \real{0.4135}}@{}} -\caption{表 2.1 环境-智能体的类型组合}\tabularnewline -\toprule\noalign{} -\endfirsthead -\endhead -\bottomrule\noalign{} -\endlastfoot -\textbf{环境} - -\textbf{智能体} & \textbf{物理环境} & \textbf{数字环境} \\ -\textbf{人类} & ~ 具有物理身体,能直接感知和互动 & ~ -通过设备(如电脑、手机)访问,依赖界面 \\ -\textbf{AI} & ~ 通过机器人或嵌入式系统体现,但本质是软件 & ~ -主要存在和运行,如算法、聊天机器人 \\ -\textbf{具身智能} & ~ 设计用于物理世界,有传感器和执行器 & ~ -可能具有数字组件,但焦点是物理体现 \\ -\end{longtable} +\begin{table}[htbp] +\centering +\caption{环境-智能体的类型组合} +\begin{tabular}{@{} l p{5cm} p{5cm} @{}} +\toprule +\diagbox{\textbf{智能体}}{\textbf{环境}} & \textbf{物理环境} & \textbf{数字环境} \\ +\midrule +\textbf{人类} & 具有物理身体,能直接感知和互动 & 通过设备(如电脑、手机)访问,依赖界面 \\[3pt] +\textbf{AI} & 通过机器人或嵌入式系统体现,但本质是软件 & 主要存在和运行,如算法、聊天机器人 \\[3pt] +\textbf{具身智能} & 设计用于物理世界,有传感器和执行器 & 可能具有数字组件,但焦点是物理体现 \\ +\bottomrule +\end{tabular} +\end{table} 其中,人类与物理环境的互动长久以来是地理学科的研究主题,即“人地关系”或“人地耦合系统”研究,涉及环境感知、景观设计、可持续性等多个议题。当前的“智能体---环境”关系研究可视为“人地关系”研究的自然延伸,可从中汲取丰富启发,有待后续深入探讨。人类与数字环境的互动则关联网络社会、人机交互等主题,在AI蓬勃发展的时代背景下催生了更多、更深刻的研究命题。AI与具身智能分别对应数字环境和物理环境,构成了人工智能的两种主要存在方式。 @@ -1008,7 +1001,7 @@ print(f"真实参数: W = [2.0, 3.0], b = [1.0]") \begin{figure} \centering \includegraphics[width=4.15529in,height=3.58481in,alt={图 2.1 智能体-环境互动框架}]{figures/ch02/image1.png} -\caption{图 2.1 智能体-环境互动框架} +\caption{智能体-环境互动框架} \end{figure} \subsection{"环境-智能体"框架与设计任务} @@ -1026,7 +1019,7 @@ Agent在环境中的行为充满复杂性,这些复杂性可以分解为不同 \begin{longtable}[]{@{} >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.2083}} >{\raggedright\arraybackslash}p{(\linewidth - 2\tabcolsep) * \real{0.5694}}@{}} -\caption{表 2.2 智能系统设计空间的复杂性维度}\tabularnewline +\caption{智能系统设计空间的复杂性维度}\tabularnewline \toprule\noalign{} \endfirsthead \endhead diff --git a/preamble.tex b/preamble.tex index aab9d96..f295074 100644 --- a/preamble.tex +++ b/preamble.tex @@ -26,6 +26,7 @@ \usepackage{tabularx} \usepackage{multirow} \usepackage{longtable} +\usepackage{diagbox} % ========== 图形 ========== \usepackage{graphicx} From d489c968e3ce8dfbca7c1af531bd335d15917fbb Mon Sep 17 00:00:00 2001 From: xiaopeng <1509442308@qq.com> Date: Sat, 30 May 2026 02:01:48 +0800 Subject: [PATCH 9/9] update to overleaf 2026-05-30 02:01 --- figures/ch02/image1.png | Bin 0 -> 81377 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 figures/ch02/image1.png diff --git a/figures/ch02/image1.png b/figures/ch02/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..5416862104d3be18f7e4d2ad3fca9e5a020d702d GIT binary patch literal 81377 zcma&ObySs6*F6eHkP?v+k?scR4y8LJ<&^w= z;2l*Y-@z3R5$=Fr#7s1$P37g`=)up(aPUFqa0sxMfUno!3l8o{COq5|@Esm@FB9_r z{wt&}^U44I{1Ns-SLl@-9GnQ8wAfo!H~9T@lm@l;x82jXO{Q#=@vKyN(b1Hm@v(Gd z__0cuJDkHQ+jK@0Y(WF%&rqa8q(*bd@n472jo%7Cp6e7^r#lWi9SL48vEO|g-dqQz3_tlm5r0KhRuwr%fs*g7BYLA69fWG%>{DKktdP zNGVSx{rBr)Uqol8A%y1t*Xu+=%bK42*B^=Y_r=+yR8pn-k3UQbQHeh%dI695e=k2u zgdAELzij&dxCf6Jon3h3iyZtP7bO{~I4=s0TF8Ig3--k^@k08qagd_G)AdPb{*w8x zN6Vqz9QN8BCq)|BtEDMm_~=0ReQ{Z*ma!vdH8Ge)J4 z2*%3H6%0R4LPZc!It*E{z3Io$Lr-&)bS;>ht_;~-_Gdz!vb;`{TY6$B2B)-bt?Qh2 z3=2$oNl1Zb@SI9D>IR^YHf~hGc%E3h8c2|K z+d<^IVDOdGGO;3^9xbWGb=eC~kg%xv;l^BXqkLE>Z2qAWPp_lMQXICPGBLhT7MYX$ zy|l2eaEUEjgQ=-aUbjC~V@2U=l#c7}f27)=7N{{pAUgFfoT;`=wdV6x)?MX0BUxW& zKYowMc4_pujO?R_EuBanRO<;A~y)5H4>XG5mx z&Qq*DcPByDcW1-s4_(~Lp5@mk-6T5m>_a^5*1{JvM&G^EXssY&FPR)(niRWJYuR_= z4u<2i4}giZ-kmDiBd%gQ_U=XkfcQ`ZSN@YDv4j}Nz_ym}73R5oimswb}S z0q*q&RgT5@jN5~$+f{_F3-+d|)>W+hhc!lP%pX`pAe+t^nqKFV^4*a{XvcD##<2bJ z>ovro@z?9(T{VRK^cG1HFXL}s7qfqAxR>0FRH%3@^wBJfDih0vrc3mM^ADGseN@%6 z>`>msj5jmUE|ib-h{IyS6a~aY`JJ;9W)D6*l;+{+@nQJ9dgn*#*Y^s%R0T~MI?ihC z#!dGZ^TU-S!rl!jJoeeM=0DTN4iy-2Kj$98Kd-7?utY9@y~%uC!bSXxS;(YIB>0(%catxxeXb5T44PtUV-!OW<=L;O}-csu9za(|ZH!iZ_AcyO&V z%m|6tO<$EHa{YJv^RU@yC+S;Mh9VWbavKuXf;WjfW|fobVd)-+wXAz)1c$K|RurBc z`;--IUT=O3a?LYdbP?E6E)HwV8Pl`wC1RDw%^400UZ#~qqQ82RDVK5KM`}t!YnW

S}&(oVm|K!&hzpkbob^6yA*iHO&mt_W3h` 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 MQrA%{RIv^I4@#59DF6Tf literal 0 HcmV?d00001