浅谈深度学习(Deep Learning)的基本思想和方法

深度学习(Deep Learning),又叫Unsupervised Feature Learning或者Feature Learning,是目前非常热的一个研究主题。

本文将主要介绍Deep Learning的基本思想和常用的方法。

一. 什么是Deep Learning?

实际生活中,人们为了解决一个问题,如对象的分类(对象可是是文档、图像等),首先必须做的事情是如何来表达一个对象,即必须抽取一些特征来表示一个对象,如文本的处理中,常常用词集合来表示一个文档,或把文档表示在向量空间中(称为VSM模型),然后才能提出不同的分类算法来进行分类;又如在图像处理中,我们可以用像素集合来表示一个图像,后来人们提出了新的特征表示,如SIFT,这种特征在很多图像处理的应用中表现非常良好,特征选取得好坏对最终结果的影响非常巨大。因此,选取什么特征对于解决一个实际问题非常的重要。


然而,手工地选取特征是一件非常费力、启发式的方法,能不能选取好很大程度上靠经验和运气;既然手工选取特征不太好,那么能不能自动地学习一些特征呢?答案是能!Deep Learning就是用来干这个事情的,看它的一个别名Unsupervised Feature Learning,就可以顾名思义了,Unsupervised的意思就是不要人参与特征的选取过程。因此,自动地学习特征的方法,统称为Deep Learning。


二. Deep Learning的基本思想

假设我们有一个系统S,它有n层(S1,...Sn),它的输入是I,输出是O,形象地表示为: I =>S1=>S2=>.....=>Sn => O,如果输出O等于输入I,即输入I经过这个系统变化之后没有任何的信息损失,保持了不变,这意味着输入I经过每一层Si都没有任何的信息损失,即在任何一层Si,它都是原有信息(即输入I)的另外一种表示。现在回到我们的主题Deep Learning,我们需要自动地学习特征,假设我们有一堆输入I(如一堆图像或者文本),假设我们设计了一个系统S(有n层),我们通过调整系统中参数,使得它的输出仍然是输入I,那么我们就可以自动地获取得到输入I的一系列层次特征,即S1,..., Sn。

另外,前面是假设输出严格地等于输入,这个限制太严格,我们可以略微地放松这个限制,例如我们只要使得输入与输出的差别尽可能地小即可,这个放松会导致另外一类不同的Deep Learning方法。上述就是Deep Learning的基本思想。

三.Deep Learning的常用方法

a). AutoEncoder

最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结构的系统,如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重,自然地,我们就得到了输入I的几种不同表示(每一层代表一种表示),这些表示就是特征,在研究中可以发现,如果在原有的特征中加入这些自动学习得到的特征可以大大提高精确度,甚至在分类问题中比目前最好的分类算法效果还要好!这种方法称为AutoEncoder。当然,我们还可以继续加上一些约束条件得到新的Deep Learning方法,如如果在AutoEncoder的基础上加上L1的Regularity限制(L1主要是约束每一层中的节点中大部分都要为0,只有少数不为0,这就是Sparse名字的来源),我们就可以得到Sparse AutoEncoder方法。

b). Sparse Coding

如果我们把输出必须和输入相等的限制放松,同时利用线性代数中基的概念,即O = w1*B1 + W2*B2+....+ Wn*Bn, Bi是基,Wi是系数,我们可以得到这样一个优化问题:

                                                                                                       Min |I - O| 

通过求解这个最优化式子,我们可以求得系数Wi和基Bi,这些系数和基础就是输入的另外一种近似表达,因此,它们可以特征来表达输入I,这个过程也是自动学习得到的。如果我们在上述式子上加上L1的Regularity限制,得到:

                                                                                Min |I - O| + u*(|W1| + |W2| + ... + |Wn|)

这种方法被称为Sparse Coding。


c) Restrict  Boltzmann Machine (RBM)

假设有一个二部图,每一层的节点之间没有链接,一层是可视层,即输入数据层(v),一层是隐藏层(h),如果假设所有的节点都是二值变量节点(只能取0或者1值),同时假设全概率分布p(v, h)满足Boltzmann 分布,我们称这个模型是Restrict  Boltzmann Machine (RBM)。下面我们来看看为什么它是Deep Learning方法。首先,这个模型因为是二部图,所以在已知v的情况下,所有的隐藏节点之间是条件独立的,即p(h|v) =p(h1|v).....p(hn|v)。同理,在已知隐藏层h的情况下,所有的可视节点都是条件独立的,同时又由于所有的v和h满足Boltzmann 分布,因此,当输入v的时候,通过p(h|v) 可以得到隐藏层h,而得到隐藏层h之后,通过p(v|h) 又能得到可视层,通过调整参数,我们就是要使得从隐藏层得到的可视层v1与原来的可视层v如果一样,那么得到的隐藏层就是可视层另外一种表达,因此隐藏层可以作为可视层输入数据的特征,所以它就是一种Deep Learning方法。

如果,我们把隐藏层的层数增加,我们可以得到Deep Boltzmann Machine (DBM);如果我们在靠近可视层的部分使用贝叶斯信念网络(即有向图模型,当然这里依然限制层中节点之间没有链接),而在最远离可视层的部分使用Restrict  Boltzmann Machine,我们可以得到Deep Belief Net (DBN) 。


当然,还有其它的一些Deep Learning 方法,在这里就不叙述了。总之,Deep Learning能够自动地学习出数据的另外一种表示方法,这种表示可以作为特征加入原有问题的特征集合中,从而可以提高学习方法的效果,是目前业界的研究热点。

<think>好的,我现在需要帮助用户整理计算机考研中数据结构的重要知识点。根据用户提供的引用内容和之前的回答,我需要综合这些信息,确保覆盖核心考点,并符合考研大纲的要求。 首先,用户提到的引用[1]中强调了数据结构的基本概念、存储结构、算法分析以及应用能力,尤其是选择题和算法应用题。之前的回答里已经分点列出了线性结构、树图、排序查找等内容,但可能需要更详细地展开每个子点,例如栈和队列的具体应用,比如括号匹配、表达式求值等。 引用[2]提到了静态链表,这是数组实现的链式存储结构,可能在选择题或填空题中出现。之前的回答中没有提到这一点,需要补充进去,特别是在线性结构部分,说明静态链表的定义、实现方式以及应用场景。 另外,用户之前的回答里提到了B/B+树,但引用[1]中特别提到需要掌握存储结构和基本操作的实现,所以需要更详细地描述B树的插入分裂规则,比如3阶B树每个节点的关键字数量限制,以及分裂过程。 关于算法分析,引用[1]强调时间复杂度和空间复杂度分析,这在每个算法部分都需要具体说明,例如快速排序的平均和最坏情况,Dijkstra算法的时间复杂度等。之前的回答已经涉及了这些,但可能需要更突出地展示复杂度公式,比如用LaTeX格式明确写出。 用户需求中还提到需要重点总结,所以可能需要将知识点分优先级,比如高频考点放在前面,并给出备考建议。例如,树和图的相关算法、排序算法查找结构(如B树、哈希表)都是重点,需要详细说明。 此外,用户可能需要例题或真题示例来辅助理解。例如,在哈夫曼树的构建中,可以举一个具体的权值例子,计算带权路径长度。或者在排序算法中,给出快速排序的分区过程示例。 需要注意引用标注,比如在提到静态链表时引用[2],在提到存储结构时引用[1]。同时,确保所有数学公式和代码块使用正确的格式,如$O(n)$,$$WPL = \sum w_i l_i$$,以及代码块使用反引号包裹。 最后,检查是否有遗漏的重要知识点,比如字符串匹配算法(KMP)、哈希表冲突解决方法等,这些也是数据结构中的常见考点,需要补充到相应部分。 总结下来,我需要重新组织数据结构部分的内容,确保涵盖所有关键点,结构清晰,重点突出,并适当加入示例和引用标注,帮助用户更好地理解和备考。</think>### 计算机考研《数据结构》核心知识点总结 根据考研大纲和真题高频考点整理,结合引用内容[^1][^2],重点覆盖以下内容: --- #### **一、基础概念逻辑结构** 1. **数据结构三要素** - **逻辑结构**:集合、线性结构(顺序表/链表)、树形结构、图状结构 - **存储结构**:顺序存储(数组)、链式存储(链表/静态链表[^2])、索引存储、散列存储 - **数据操作**:插入、删除、查找、遍历(时间复杂度需明确标注,如链表插入$O(1)$,顺序表查找$O(n)$) 2. **算法分析** - **时间复杂度**:常见阶数$O(1)/O(n)/O(n^2)/O(n \log n)$,例如快速排序平均复杂度$O(n \log n)$,最坏$O(n^2)$ - **空间复杂度**:递归算法需注意栈空间(如二叉树遍历递归实现空间复杂度$O(h)$,h为树高) --- #### **二、线性结构重点** 1. **顺序表链表** - **对比**:顺序表支持随机访问($O(1)$),但插入/删除需移动元素($O(n)$);链表插入/删除快($O(1)$),但查找需遍历($O(n)$) - **静态链表**:用数组模拟链式结构,节点包含`data`和`next`(指向数组索引),适合内存受限场景 2. **栈队列** - **栈应用**:括号匹配、递归函数调用(函数调用栈)、后缀表达式求值 - **队列应用**:层次遍历二叉树、操作系统中进程调度 - **循环队列判满公式**: $$ (\text{rear} + 1) \% \text{size} == \text{front} $$ --- #### **三、树图核心算法** 1. **二叉树** - **遍历算法**: - 非递归实现:借助栈(先序)、队列(层次遍历) - 哈夫曼树:带权路径长度$WPL = \sum (w_i \times l_i)$,构建方法(合并最小权值节点) - **平衡树**:AVL树旋转操作(LL/RR/LR/RL型) 2. **图算法** - **最短路径**: - **Dijkstra算法**:单最短路径,贪心策略,时间复杂度$O(n^2)$ - **Floyd算法**:多最短路径,动态规划,时间复杂度$O(n^3)$ - **最小生成树**: - **Prim算法**:从点出发,时间复杂度$O(n^2)$ - **Kruskal算法**:按边权排序,时间复杂度$O(e \log e)$ --- #### **四、排序查找高频考点** 1. **排序算法对比** | 算法 | 平均时间复杂度 | 空间复杂度 | 稳定性 | |----------|----------------|------------|--------| | 快速排序 | $O(n \log n)$ | $O(\log n)$| 不稳定 | | 归并排序 | $O(n \log n)$ | $O(n)$ | 稳定 | | 堆排序 | $O(n \log n)$ | $O(1)$ | 不稳定 | - **快速排序优化**:随机选择基准元素、三数取中法 - **稳定性定义**:相同关键字元素排序后相对位置不变 2. **查找结构** - **B/B+树**: - B树定义:m阶B树每个节点最多$m-1$个关键字,非叶节点最少$\lceil m/2 \rceil$子树 - B+树特点:叶子节点链表连接,适合范围查询 - **哈希表**: - 冲突处理:开放定址法(线性探测)、链地址法 - 装填因子$\alpha = \frac{\text{元素数}}{\text{表}}$,影响查找效率 --- #### **五、算法设计分析** 1. **递归分治** - 典型问题:汉诺塔、归并排序、快速排序 - **递归时间复杂度分析**:主定理(如归并排序递推式$T(n) = 2T(n/2) + O(n)$,解得$T(n) = O(n \log n)$) 2. **动态规划** - 核心思想:最优子结构、重叠子问题 - 典型例题:最公共子序列(LCS)、0-1背包问题 --- #### **真题示例备考策略** 1. **高频真题类型** - **算法应用题**:设计算法判断二叉树是否为平衡树(需计算高度差) - **代码填空**:静态链表插入操作(修改`next`指针索引) - **计算题**:哈夫曼树WPL计算(如权值{2,3,5,7},构建后WPL=2×3 + 3×3 + 5×2 + 7×1 = 34) 2. **备考建议** - **优先级**:树图(35%)>排序/查找(25%)>线性结构(20%)>算法设计(20%) - **刷题重点**:近5年408真题、《数据结构高分笔记》经典例题 --- ### 相关问题 1. 如何快速推导二叉树遍历的非递归实现? 2. B树和B+树在数据库索引中的应用有何区别? 3. 动态规划解决背包问题的状态转移方程如何构建? [^1]: 考研《数据结构》知识点总结 [^2]: 计算机考研——数据结构笔记
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值