leetcode--搜索

内容

一些关于深度优先搜索和宽度优先搜索的综合题

leetcode题目

200. Number of Islands

题意:

1代表陆地,0代表水域,找图中岛屿的数量。

解题思路:

方法一:深度优先搜索
方法二:广度优先搜索

DFS代码:

//写DFS函数,写出方向数组进行递归,递归时判断递归条件
//1是否越界  2点是否为1且mask为0
void DFS(vector<vector<int>> &mark, vector<vector<char>> &grid, 
        int x, int y){
    //方向数组,左右上下
    mark[x][y] = 1;
    static const int dx[] = {-1, 1, 0, 0};
    static const int dy[] = {0, 0, -1, 1};
    for (int i = 0; i < 4; i++){
        int newx = dx[i] + x;
        int newy = dy[i] + y;
        if (newx < 0 || newx >= mark.size() || 
            newy < 0 || newy >= mark[newx].size()){
            continue;
        }
        if (mark[newx][newy] == 0 && grid[newx][newy] == '1'){
            DFS(mark, grid, newx, newy);
        }
    }
}

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        int island_num = 0;
        vector<vector <int>> mark;
        for (int i = 0; i < grid.size(); i++){
            mark.push_back(vector<int>());
            for (int j = 0; j < grid[i].size(); j++){
                mark[i].push_back(0);
            }
        }
        for (int i = 0; i < grid.size(); i++){
            for (int j = 0; j < grid[i].size(); j++){
                if (mark[i][j] == 0 && grid[i][j] == '1'){
                    DFS(mark, grid, i, j);
                    island_num++;
                }
            }
        }
        return island_num;
    }
};

BFS代码:

void BFS(vector<vector<int>> &mark, vector<vector<char>> &grid, 
        int x, int y){
    //方向数组,左右上下
    mark[x][y] = 1;
    static const int dx[] = {-1, 1, 0, 0};
    static const int dy[] = {0, 0, -1, 1};
    queue<pair<int, int>> Q;
    Q.push(make_pair(x, y));
    while (!Q.empty()){
        x = Q.front().first;
        y = Q.front().second;
        Q.pop();
        for (int i = 0; i < 4; i++){
            int newx = x + dx[i];
            int newy = y + dy[i];
            if (newx < 0 || newx >= mark.size() || 
                newy < 0 || newy >= mark[newx].size()){
                continue;
            }
            if (mark[newx][newy] == 0 && grid[newx][newy] == '1'){
                Q.push(make_pair(newx,newy));
                mark[newx][newy] = 1;
            }
        }
    }

}

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        int island_num = 0;
        vector<vector <int>> mark;
        for (int i = 0; i < grid.size(); i++){
            mark.push_back(vector<int>());
            for (int j = 0; j < grid[i].size(); j++){
                mark[i].push_back(0);
            }
        }
        for (int i = 0; i < grid.size(); i++){
            for (int j = 0; j < grid[i].size(); j++){
                if (mark[i][j] == 0 && grid[i][j] == '1'){
                    BFS(mark, grid, i, j);
                    island_num++;
                }
            }
        }
        return island_num;
    }
};

127. Word Ladder

题意:

求两个单词之间的最短转换路径,每次只能转换单词中的一个字符。

解题思路:

制作单词的连接图,用宽度优先搜索进行遍历。
1、一个vector储存所有的word
2、用一个map<string, vector<string>>存储图。
3、用queue去遍历整个邻居图,queue存的是pair

代码:

bool connect(const string &word1, const string &word2){
    int count = 0;
    for (int i = 0; i < word1.length(); i++){
        if (word1[i] != word2[i]){
            count ++;
        }
    }
    return count == 1;
}

void construct_graph(string &beginWord, vector<string> &wordList, 
                    map<string, vector<string>> &graph){
    wordList.push_back(beginWord);
    //初始化图
    for (int i = 0; i < wordList.size(); i++){
        graph[wordList[i]] = vector<string>();
    }
    for (int i = 0; i < wordList.size(); i++){
        for (int j = i+1; j < wordList.size(); j++){
            if (connect(wordList[i],wordList[j])){
                graph[wordList[i]].push_back(wordList[j]);
                graph[wordList[j]].push_back(wordList[i]);
            }
        }
    } 
}

int BFS(string &beginWord, string &endWord, map<string, vector<string>> &graph){
    queue<pair<string, int>> Q;
    set<string> visit;
    Q.push(make_pair(beginWord, 1));
    visit.insert(beginWord);
    while (!Q.empty()){
        string node = Q.front().first;
        int step = Q.front().second;
        Q.pop();
        if (node == endWord){
            return step;
        }
        const vector<string> &neighbors = graph[node];
        for (int i = 0; i < neighbors.size(); i++){
            if (visit.find(neighbors[i]) == visit.end()){
                Q.push(make_pair(neighbors[i], step + 1));
                visit.insert(neighbors[i]);
            }
        }
    }
    return 0;
}

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        map<string, vector<string>> graph;
        construct_graph(beginWord, wordList, graph);
        return BFS(beginWord, endWord, graph);
    }
};

126. Word Ladder II

题意:

跟上一题类似,但是是返回所有的路径。

解题思路:

代码:

答案是个人总结的,非标准答案,如有错误,请指教!

数据结构

1、层次遍历树
用队列储存节点,弹出当前层的所有节点,初始值为1,并压入弹出节点的子节点,同时记录个数,用于下一层的循环。

2、开根号如何求
二分法、快速开根算法。

机器学习

1、xgboost与GBDT区别(算法到内存)。

  • GBDT在优化时只用到一阶导数信息,通过负梯度的方向拟合残差,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。
  • xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和
  • xgboost支持在特征颗粒上的并行计算,他会对特征先进行一个排序,再进行特征选择。有一定的并行计算的能力。

2、GBDT的理解?其中的决策树是分类还是回归?
GBDT通过负梯度的方向拟合残差,达到boost的效果,它的基分类器是CART(分类回归决策树)可以用于分类和回归,用于分类时构造树的指标是gini系数,用于回归时,构造树的指标是MAE或者MSE。

3、 随机森林原理,优缺点
通过bagging的思想,有放回的采样数据,制造出多个数据集,每个数据集训练一颗决策树,每次训练不用所有的特征而是用特征的一部分,一般会用log2d个特征,d是总特征数。最后的结果如果是分类用投票法,回归用平均法。这样做能提高模型的泛化能力,减小过拟合的风险。
优缺点:
优点:1、相比于boosting的算法,RF训练可以并行化,对于大规模样本的训练具有速度的优势 2、由于进行随机选择决策树划分特征列表,这样在样本维度比较高的时候,仍然具有比较高的训练性能 3、给出各个特征的重要性列表 4由于存在随机抽样,训练出来的模型方差小,泛化能力强 5 RF实现简单
缺点:1 在某些噪音比较大的特征上,RF模型容易陷入过拟合 2、
取值比较多的划分特征对RF的决策会产生更大的影响,从而有可能影响模型的效果

4、 kmeans聚类算法的求解,推导。该算法常会受到所选特征的影响而导致聚类结果差异较大,如何解决?
Kmeans算法是先选取K个簇心点,每个样本点用欧式距离分到距离最近的簇心点的类中,然后求每一个类的均值,得到新的簇心点。迭代这个过程知道达到一定的条件。
推导过程:目标函数是属于这个类的点里簇心点的均方差比较小,对簇心点求导就是所有数的平均值。
算法主要问题是
1对离群点比较敏感,可以采用k中值的方法,就是不取平均值而取中间值,对于离群点比较多的数据可以采用这种方法。
2对于初始的簇心点选择比较敏感,可以采用kmeans++的算法,就是先选取一个点,然后选取所有点中离簇心点距离之和最远的点作为新的簇心点。这种算法的问题是每个点的选择与前一个点相关,有内在的有序性。还有一种方法是canopy,是先设定一个R1 R2值,大于R2就作为新的簇心点,小于R1 选取新点为簇心点,R1-R2之间归到这类中,这种算法的优点是不用设定K值,对于初始簇心的选择不是很敏感。还有其他的聚类算法有层次聚类分为分裂和聚合、谱聚类和密度聚类。

5、决策树(ID3,C4.5,CART)原理,信息增益公式推导,信息增益比的引入原因,Gini指数的用途和原理
ID是采用信息熵作为判断标准,信息熵是-plogp的累加和,信息熵越小,数据越纯,决策树划分的标准就是朝着信息熵减少最多的特征进行划分。但是这个算法对于类型比较多的特征有偏好,例如数据的编号,能使信息熵降到最低,但是其实是没有划分效果的,所以引入了信息熵增益率,C4.5,它会除以每个特征的信息熵,类型较多的特征信息熵会比较大,缓解了对类型多的特征的偏好,而CART是分类回归树,它可以用于分类和回归问题,对于分类问题,它用gini系数,gini系数是1-p^2的累加,对于回归问题,一般用MAE。

6、数据不均衡怎么处理
数据不均衡指的是正负样本的数量相差比较大,有三种处理方法,第一个是上采样的方法,最普通的是随机采样少数类样本,增加样本的数量,但是这样容易造成过拟合,第二种是下采样的方法,也就是少取一些多数类的样本,降低数量,但是可能会失去一些重要的训练样本,最常用的是第三种方法,SMOTE它是一种改进的上采样方法,它通过插值的方法随机构造样本,具体的过程是,对于每一个样本,找到同类型的k个最近的样本(欧氏距离),然后随机选取一个,在这两个样本之间,选取一个(0,1)之间的值,进行插入。构造出新的数据。

7、数据特征怎么选取
数据特征太多会造成维数灾难,有三种选取特征的方法,过滤式,包裹式、嵌入式,过滤式指的是在训练之前对特征进行筛选,常用的指标有方差、卡方系数、相关系数,包裹式是通过交叉验证的方法,对训练好的模型进行评估,选取合适的特征集合,这种方法效果比较好,但是时间复杂度很高。嵌入式是把特征选择嵌入到模型中,常用带L1正则项得到稀疏的解,然后对特征进行过滤,或者用树的结构进行过滤。还可以用降维学习的方法,例如LDA、PCA等,降低特征维度。

8、朴素贝叶斯推导,优缺点
朴素贝叶斯是基于条件概率的一个生成模型,由于属性比较多的时候会有组合爆炸的问题,它假设属性条件是相互独立的。它利用极大似然估计,计算各个条件下等于目标的概率,乘起来,选择乘积最大的一项。如果是连续型的特征,假定它服从正态分布,根据概率密度函数计算概率。
优缺点:
优点:对小规模的数据表现很好,适合多分类任务,适合增量式训练,朴素贝叶斯法高效且易于实现。
缺点:对输入数据的表达形式很敏感,分类的性能不一定很高。依赖于假定的分布是否符合潜在的真实分布。

9、SVM推导,优缺点、调参方法
首先SVM的核心思想是找到一个分类平面,使得分类平面能很好的区分开不同类型的样本,而且离最近的样本比较远。它的公式推导是先算样本点到决策平面的距离,就是在决策平面上找一个点,然后将两点之间的向量投影到决策平面上,使得最小的点到决策平面上的点的距离最大化,这个属于对偶问题,可以转化为先求最小的点的距离,再将这个距离最大化,对问题进行放缩,将最小的距离放缩为1,问题变成最大值目标函数,有一个约束是所有点到平面的距离大于1。然后用拉格朗日乘子法进行求解。由于有不等式条件,要满足KKT条件要求所有alpha>0。
优缺点:
根据拉格朗日乘子法,每个样本要确定一个alpha值,这样的运算复杂度比较高,一般采用SMO的优化方法,每次只更新其中两项的alpha值,其他参数固定,最理想的情况是选择与KKT条件偏离最远的点作为训练,SMO采用了一个启发式的方法,每次选取距离最远的两个点进行训练。
存在多分类困难的特点,比较常用的解决方法有两种OVR和OVO,OVR是k个类型,其中一个是1类,剩余的是另外一类,设计K个SVM,选择分类数值最大的一类,这种算法的问题在于存在严重的样本不均衡的问题。
OVO是两两特征组成一个SVM,一共有k(k-1)/2个SVM,选择的票最多的类型。
对于线性不可分的问题,要映射到高维空间,计算复杂度比较大,一般采用核函数的方法进行映射。
参数调节:
决策树主要调节的是松弛因子和核函数。松弛因子C可以根据过拟合的程度进行调节,如果特征比较多,一般采用线性核函数,如果特征比较少采用高斯核函数。

10、Logistic回归推导,损失函数,优缺点
逻辑回归是首先讲theta X带入到sigmoid函数里面,(1+e的-theta x次方)分之一,使得线性的值映射到(0,1)的区间之中,然后用对数损失函数,如果是正例,损失值是-log(h(x)),如果是负例,损失值是-log(1-h(x)),因为正负样本的损失值不同,将他们合并,乘以一个yi,当label = 1 时候y是1,label = 0 时候 y是0,也就是正例损失值前面成一y,负例前面乘(1-y)具体写成:-y(log(h(x))-(l-y)log(h(1-h(x))),然后对theta求导求出梯度的方向。
优点:可解释性强,模型简单。
缺点:对于接近于0之间的特征值变化比较敏感,但是两边的特征值变化存在梯度消失的问题。

11、对Adaboost的理解
Adaboost是boosting思想的一种算法,它前后学习器之间是相互关联的,核心思想是给每个样本分配一个权重,如果前面的模型把某个样本分错了,会更多的考虑这个样本,权重会升高,如果分类对了,权重会减小,具体做法是,学出一个基学习器(决策树的算法),然后每个学习器有一个权值,损失函数对权值求导可以得出权值,然后根据权值更新新一轮的样本权重。
优点:可解释性强,模型简单
缺点:对异常点敏感,异常点可能会有一个比较大的权值,可以用随机森林里离群点检测的方法先对样本进行一下筛选再训练。

12、xgbosst和gbdt、Adaboost的参数调节
通过网格搜索的方法用交叉验证进行选取。

13、偏差和方差的区别。ensemble的方法中哪些是降低偏差,哪些是降低方差?
bagging是降低方差的模型,每个学习器都是强学习器,降低过拟合的风险,boosting是降低偏差的,xgboost和GBDT是通过拟合残差的方式,Adaboost是通过调整样本权重的方式,拟合前面模型的误差,降低模型欠拟合的程度。

14、讲一下常用的损失函数以及各自的适用场景。
损失函数有
MAE绝对值损失函数和MSE平方损失函数适用于回归的算法。
分类的算法用感知损失函数,是有一个阈值,但大于这个阈值分到一类,小于这个阈值分到另一类。或者0,1损失函数。
多分类问题用softmax的损失函数,就是等于将每个分类的损失值先求指数再做一个归一化操作。
逻辑回归里面用到对数损失函数。

15、评价函数种类
对于回归的问题:
一般用MAE、MSE、R方作为评价指标,R方取值是负无穷到1,越接近于1,模型效果越好。MAE和MSE需要考虑到预测值的取值范围。MSE相当于对预测值与真实值差比较大的项有一个加大的惩罚,也可以自己设计评价函数,如果想减小对预测差异比较大的项的惩罚可以将值映射到对数损失函数里面。
对于分类问题:
最基本的是错误率和精度,但是对于样本不均衡的数据,会有不好的结果,例如癌症检测,全部预测为反例,精度可能就有90多。所以引入了查全率和查准率,查全率是所有的正例中,能识别出来的比例占多少,查准率是识别出来的正例有多少是真正的正例,把他们结合起来的是F1评价指标,是这两项的调和平均数,调和平均数的优点在于会比较着重的考虑较小的那一项,如果想侧重考虑其中某一项目可以加入一个系数。
还有另外一个评价分类函数的指标是AUC值,他是ROC曲线下的面积,具体的做法是先根据样本的预测值进行排序,正例向上移动一步,反例向右移动一步。这种评价方法能比较好的看到样本的整体分布情况。AUC值能比较好的评价样本不均衡的数据集。

16、对XGboost的理解
XGboost也是一种拟合残差的集成学习的方法。它的核心思想是对残差进行泰勒展开到二次项,然后加入了正则项,对树的数量和叶节点值的大小进行了限制,求出损失函数,利用损失函数代替GBDT里面的回归决策树对树进行划分。

17、讲一下GBDT的细节,写出GBDT的目标函数。 GBDT和Adaboost的区别与联系
GBDT是用回归分类决策树作为基分类器,然后每次迭代向负梯度的方向拟合残差,它可以通过减少迭代步长、加入子采样比例、决策树剪枝的方法减少过拟合的风险,提升泛化能力。Adaboost是对每个样本赋予一个权重,每个学习器也有一个权重,先求出学习器的权重,再下一轮的权重进行更新,前面模型分类错的样本,在本轮中会有更大的权重,着重考虑分类错的点,减少对已经分类正确的点的考虑。达到集成学习的效果。他们都是Boosting的算法,但是思想不一样,一个是拟合残差,一个是调整样本权重,他们有共同的问题就是boosting的算法是串型的算法,难以实现并行计算,然后Adaboost对于离群点比较敏感,一些离群点可能会得到比较大的权重。

18、讲一下PCA的步骤。PCA和SVD的区别和联系
PCA的理念是使得数据投影后的方差最大,找到这样一个投影向量,满足方差最大的条件即可。而经过了去除均值的操作之后,就可以用SVD分解来求解这样一个投影向量,选择特征值最大的方向。

19、EM算法。它和Kmeans之间的联系

20、LR和SVM之间的关系
他们都可以处理回归问题。他们都是线性的模型,SVM可以通过核函数映射求解非线性可分的问题,LR则可以采用多项式扩展的方法。
他们的损失函数不同,LR是对数损失函数,SVM是hinge-loss损失函数,SVM只考虑支持向量就能得到决策平面,它可以通过少量的样本得到比较合理的分类模型,LR则需要相对比价多的样本。

21、LR和随机森林区别
随机森林等树算法都是非线性的,而LR是线性的。LR更侧重全局优化,而树模型主要是局部的优化。

22、常用的优化方法
一阶的算法是:
梯度下降、随机梯度下降、mini 随机梯度下降降法。随机梯度下降不但速度上比原始梯度下降要快,局部最优化问题时可以一定程度上抑制局部最优解的发生。 对于带L1正则项的,他在原点处不能求导可以采用坐标轴下降法。还有一些基于动量的方法,它能比较好的抑制损失函数震荡。
二阶的方法有牛顿法和拟牛顿法,拟牛顿法通过求Hession的逆而不用求二阶导数,二阶的方法收敛速度比一阶要快,但是二阶是定迭代长的方法,不能保证损失函数稳定的下降。

23、KNN和Kmean的异同
他们都是基于懒惰学习的机制,需要大量计算距离
KNN不需要训练,只需要求出最近的几个样本,采用多数表决的方法得出分类。Kmeans需要训练。

24、前剪枝的几种停止条件
节点中样本为同一类
特征不足返回多类
如果某个分支没有值则返回父节点中的多类
样本个数小于阈值返回多类

25、KD树
KD树是KNN的一种优化算法,KNN找遍历整个数据集,找到最小距离的点,当数据集比价大的时候复杂度比价大,KD树是用方差构建一个二叉树,等于将多维空间用一些超平面进行了划分,当我们生成KD树以后,就可以去预测测试集里面的样本目标点了。对于一个目 标点,我们首先在KD树里面找到包含目标点的叶子节点。以目标点为圆心,以 目标点到叶子节点样本实例的距离为半径,得到一个超球体,最近邻的点一定在 这个超球体内部。然后返回叶子节点的父节点,检查另一个子节点包含的超矩形 体是否和超球体相交,如果相交就到这个子节点寻找是否有更加近的近邻,有的话 就更新最近邻。如果不相交那就简单了,我们直接返回父节点的父节点,在另一 个子树继续搜索最近邻。当回溯到根节点时,算法结束,此时保存的最近邻节点 就是最终的最近邻。

26、EM算法与kmeans之间的联系
EM算法和Kmeans算法是类似的,Kmeans算法是初始化K个簇心点,然后将样本分配到簇心点中,然后更新簇心点,重复迭代到收敛,而EM算法是根据当前的参数来计算对数似然的估计值,然后寻找最大的似然值的隐变量,根据新的隐变量更新当前的参数,重复迭代到收敛。

27、PCA和SVD之间的联系
SVD可以获取另一个方向上的主成分,而PCA只能获得单个方向上的主成分,注意到PCA也能达到降秩的目的,但是PCA需要进行零均值化,且丢失了矩阵的稀疏性。 通过SVD可以得到PCA相同的结果,但是SVD通常比直接使用PCA更稳定。

28、PCA和LDA的区别
PCA是无监督的降维,LDA是有监督的降维。

29、求内积,就是A*B相当于AB的模乘以cosa,相当于将A投影到B上乘以B,也就是内积再除以B的模就是A投影到B上后的大小。

30 PCA的步骤
1、去中心化,每个样本的每个特征减去均值,使得均值为0,方便协方差的计算。
2、XTX计算出协方差矩阵,是一个对称的对称矩阵,对角线上是方差项,非对角线上是协方差,PCA的求解目标就是希望特征的方差尽可能的大,能够很好的区分特征,协方差尽可能小,希望特征之间是线性无关的。
3、求协方差矩阵的特征值,根据特征值进行对角化能实现目标,选择前K项特征值,然后用归一化后的特征向量对样本进行映射得到降维的目的。

概率题:

1、一根绳子,随机选两点截断,三条线段能组成三角形的概率
用面积法求,边界是x+y > 0.5, x < 0.5, y < 0.5, 求这个在0.5*0.5的正方形下的面积。面积是1/4。

深度学习

1、讲一下pooling的作用, 为什么max pooling要更常用?哪些情况下,average pooling比max pooling更合适?
它能降低输出的维度,得到定长的输出,等于对模型进行了简化,降低了过拟合的风险。maxpooling可以得到相对的位移不变性,无论特征点在哪里,只要最大就提取该特征,能比较好的得到轮廓信息。averagepooling一般在处理的特征维度比较小需要综合考虑的时候使用。

3、CNN和RNN的梯度消失是一样的吗?
不一样,CNN的梯度消失是因为sigmoid和tanh函数对于两边的值不敏感,导致梯度过小,解决方法是采用Relu的激活函数,但是relu存在硬饱和区,也有梯度消失的情况,如果relu失效的情况可以尝试crelu的损失函数。
RNN的梯度消失或者爆炸是因为RNN是一个串型的结果,每次训练都与前面的隐藏层相连,连乘导致小于1的值越来越小,大于1的值越来越大,导致梯度消失或爆炸,解决方法是采用门结构的网络如LSTM。

4、有哪些防止过拟合的方法?
dropout、加入正则项、early stopping、降低模型复杂度,数据集扩充、bagging

5、batch size对收敛速度的影响。
batch size一般取64或128,batch size太小和太大都会对收敛速度有影响,太小的话每次计算出的梯度方向和真实梯度方向可能会相差太大。太大的话每一次计算梯度的时间会变长。

6、CNN做卷积运算的复杂度。如果一个CNN网络的输入channel数目和卷积核数目都减半,总的计算量变为原来的多少?

7、data augmentation有哪些技巧?
图像的剪切,旋转,对称。SMOTE,加入高斯噪声。

8、讲一下你了解的优化方法,sgd, momentum, rmsprop, adam的区别和联系
sgd是随机梯度下降,它收敛速度快,但是容易收敛到局部最小值或者鞍点
momentum是基于动量的方法进行更新,能比较好的缓解损失值不断震荡的情况。adagrad是采用一个自适应的学习率,当梯度比较大的时候学习率衰减比较快,梯度比较小学习率衰减比较慢,这个方法容易过早的结束训练,rmsprop是有一个衰减系数,稳定的衰减学习率,在RNN类的模型上表现比较好。Adam通过二阶矩的方法,是一个带动量的rms,得到比较稳定的参数和收敛效果。

9 讲一下激活函数sigmoid,tanh,relu. 各自的优点和适用场景
sigmoid函数取值范围是0到1,tanh函数的取之范围是-1到1,tanh的收敛速度比sigmoid快,但是他们都存在梯度消失的问题,对于两边区间的差异不敏感。所以一般采用relu激活函数,但是relu在<0的区间存在硬饱和区,如果使用relu出现问题可以尝试使用Crelu,它映射到对数函数上,保留和负数区间的梯度。

10.1 RNN的理解
RNN循环神经网络是用于处理特征之间有时序关系的问题。它有两种基本的形式BPTT和导师驱动,一种是串型的结构,每一层的隐藏层与上一层的隐藏层相连,另外一种是每一层的隐藏层与上一层的输出层相连,这种方法的有点是输出结果可以由训练集给出,可以实现并行运算,但是只考虑到了上一层的结果。如果是上下文有联系的,然后一种双向RNN的模型,RNN的主要问题是容易梯度消失和梯度爆炸,因为连乘导致小于1的越来越小,大于1的越来越大。所以引入了LSTM模型。

10.2 LSTM中每个gate的作用是什么,为什么跟RNN比起来,LSTM可以防止梯度消失
LSTM采用门控的结构赖防止梯度消失和爆炸,它有三个门,遗忘门,输入门和输出门。
遗忘门决定什么信息将会被传到后面的结构,它是将上一层的隐藏层和本层的输入做一个线性变换,传入到sigmoid函数里面,然后把得出来的0到1之间的值与上一层的输出相乘,达到过滤的效果。
输入门决定本层什么信息会被加入到模型之后,他是将上一层的隐藏层和本层的输入做两个不同的线性变换,一个放到sigmoid函数里面,一个放到tanh函数里面,将他们相乘,达到过滤本层信息的效果。
然后跟新细胞信息,就是将遗忘门的输出结果和输入门的输出结果相结合,然后输出门再利用上一层的隐藏层信息和本层信息做一个过滤用的sigmoid层,与结合后的结果相乘,最后就是输出的结果。

Gated Recurrent Unit (GRU)就是lstm的一个变体,这是由 Cho, et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。

11 什麽样的资料集不适合用深度学习?
数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势。
数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。

12 什麽造成梯度消失问题?
神经网络的训练中,通过改变神经元的权重,使网络的输出值尽可能逼近标签以降低误差值,训练普遍使用BP算法,核心思想是,计算出输出与标签间的损失函数值,然后计算其相对于每个神经元的梯度,进行权值的迭代。
梯度消失会造成权值更新缓慢,模型训练难度增加。造成梯度消失的一个原因是,许多激活函数将输出值挤压在很小的区间内,在激活函数两端较大范围的定义域内梯度为0。造成学习停止

13、为什么引入激活函数
因为如果不用非线性激励函数,每一层都是上一层的线性函数,无论神经网络多少层,输出都是输入的线性组合,与只有一个隐藏层效果一样。相当于多层感知机了。所以引入非线性激励函数,深层网络就变得有意义了,可以逼近任意函数。

14、CNN通过:局部感知、权值共享、池化操作、多层次结构抓住了这个共性。局部感知使网络可以提取数据的局部特征;权值共享大大降低了网络的训练难度;池化操作和多层次结构一起,实现了数据的降维,将低层次的特征组合成高层次的特征。

15、什么时候用local-conv?什么时候用全卷积(每一个点用同一个filter)?
当数据集具有全局的局部特征分布时,也就是说局部特征之间有较强的相关性,适合用全卷积。在不同的区域有不同的特征分布时,适合用local-Conv。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值