1、NLP与深度学习基础:自然语言处理概述、深度学习在NLP中的应用、TensorFlow环境搭建与基础

1.1 自然语言处理概述

自然语言处理,说白了就是让机器能看懂人话。我刚开始接触这个领域时,觉得这事儿挺玄乎的——计算机只懂0和1,怎么理解「我爱你」和「你爱我」的区别?

其实核心就两件事:理解生成。理解是把文字变成机器能处理的结构化数据,生成是把结构化数据变回人话。

举个例子。你在搜索引擎输入「苹果手机价格」,系统得知道:

  • 「苹果」不是水果,是品牌
  • 「手机」是产品类别
  • 「价格」是查询意图

这就是NLP的典型任务——命名实体识别意图分类

常见的NLP任务包括:

  • 文本分类:判断邮件是垃圾还是正常
  • 情感分析:判断评论是好评还是差评
  • 机器翻译:中译英、英译中
  • 问答系统:根据问题从文档中找答案
  • 文本生成:写新闻、写诗、写代码

我记得刚入行时,老板让我做一个客服意图识别系统。我天真地以为写几个正则表达式就能搞定,结果被各种奇葩问法打得鼻青脸肿。后来才明白,NLP的难点就在于语言的歧义性多样性

核心观点:NLP不是让机器「理解」语言,而是让机器学会从数据中「统计」出语言的规律。说白了,就是暴力美学。

1.2 深度学习在NLP中的应用

传统NLP方法靠的是人工特征工程——写规则、做模板、提取特征。我早期做过一个分词系统,光规则就写了2000多条,结果换个领域就崩了。

深度学习改变了这一切。它不需要你手动设计特征,而是让模型自己从数据中学习。

为什么深度学习适合NLP?

  • 端到端学习:输入原始文本,直接输出结果
  • 自动特征提取:模型自己学什么特征有用
  • 强大的表达能力:深层网络能捕捉复杂模式

深度学习在NLP中的里程碑:

年份 模型 意义
2013 Word2Vec 词向量时代开启
2014 Seq2Seq + Attention 机器翻译突破
2017 Transformer 彻底抛弃RNN
2018 BERT 预训练时代到来

你想想看,从Word2Vec到BERT,也就五年时间。我2016年做项目时还在用LSTM,现在回头看,那玩意儿又慢又难训练。Transformer出来后,RNN基本被淘汰了。

我的建议:学NLP深度学习,直接从Transformer入手。RNN可以了解,但别花太多时间。我曾经花了两周调一个LSTM的梯度裁剪,后来换成Transformer,一天就搞定了。

1.3 TensorFlow环境搭建与基础

好,理论说完了,咱们来点实际的。先把环境搭起来。

1.3.1 安装TensorFlow

我个人习惯用Anaconda管理Python环境,干净、好隔离。你想想看,项目多了,Python版本、依赖包互相打架,那叫一个头疼。

# 创建虚拟环境
conda create -n tf_nlp python=3.9

# 激活环境
conda activate tf_nlp

# 安装TensorFlow
pip install tensorflow==2.12.0

# 验证安装
python -c "import tensorflow as tf; print(tf.__version__)"

嗯,这里要注意:

  • 别用最新版,容易踩坑。我建议用2.10到2.13之间的版本
  • 有GPU的话,装tensorflow-gpu版本,训练速度快10倍不止
  • Windows用户注意,TensorFlow 2.10之后不再原生支持GPU,建议用WSL2

避坑指南:我曾经在Windows上折腾GPU版本,装了卸、卸了装,折腾了两天。后来发现直接用Google Colab或者Linux虚拟机,省心多了。如果你不是必须本地跑,建议先用Colab。

1.3.2 TensorFlow基础操作

TensorFlow的核心是张量(Tensor)。说白了,就是多维数组。标量是0维,向量是1维,矩阵是2维,再往上就是高维张量。

import tensorflow as tf

# 创建张量
scalar = tf.constant(42)           # 标量
vector = tf.constant([1, 2, 3])    # 向量
matrix = tf.constant([[1, 2], 
                      [3, 4]])     # 矩阵

# 张量运算
a = tf.constant([[1, 2], [3, 4]])
b = tf.constant([[5, 6], [7, 8]])

c = tf.matmul(a, b)  # 矩阵乘法
d = tf.add(a, b)     # 加法

print(c.numpy())     # 转成numpy数组查看

我刚开始学的时候,总搞不清tf.constant和tf.Variable的区别。简单说:

  • tf.constant:不可变,像常量
  • tf.Variable:可变,像变量,模型参数就用这个

1.3.3 自动求导机制

深度学习最核心的就是梯度下降。TensorFlow的自动求导让你不用手动算导数,它自动帮你算好。

# 自动求导示例
x = tf.Variable(3.0)

with tf.GradientTape() as tape:
    y = x ** 2 + 2 * x + 1

# 计算dy/dx
grad = tape.gradient(y, x)
print(grad.numpy())  # 输出: 8.0 (因为导数=2x+2, x=3时=8)

这个GradientTape是我最喜欢的API之一。以前用别的框架,得自己写反向传播,写错一个符号整个模型就废了。现在好了,把前向计算写在with块里,梯度自动算好。

1.3.4 构建第一个模型

咱们用Keras API搭一个最简单的神经网络,做文本分类。

from tensorflow.keras import layers, models

# 构建模型
model = models.Sequential([
    layers.Dense(64, activation='relu', input_shape=(100,)),
    layers.Dense(32, activation='relu'),
    layers.Dense(1, activation='sigmoid')
])

# 编译模型
model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)

# 打印模型结构
model.summary()

这个模型虽然简单,但麻雀虽小五脏俱全。Dense层就是全连接层,relu是激活函数,sigmoid把输出压到0-1之间做二分类。

我的习惯:每次搭模型前,先用model.summary()看一眼参数量。如果参数量比训练数据还多,八成要过拟合。我有个项目就是没注意这个,模型在训练集上99%准确率,测试集上直接崩到50%。

1.4 本章小结

这一章咱们聊了:

  • NLP是什么——让机器处理人类语言
  • 深度学习怎么改变NLP——从手工特征到自动学习
  • TensorFlow怎么用——张量、自动求导、模型搭建

下一章,咱们会深入词向量和文本表示。你想想看,机器怎么把「苹果」这个词变成一个向量?这里面门道可多了。

记住一句话:NLP的起点,是把文字变成数字。后面的所有模型、所有技巧,都是在这个基础上玩花样。

好了,动手试试吧。把环境搭好,跑通上面的代码。有问题随时翻回来看看。