博客园 首页 私信博主 显示目录 隐藏目录 管理

京东第一次电面

问题包括:推荐算法,两个算法题,l1l2正则化的对比,梯度下降和牛顿法,LRGBDTXGBOOST,线程和进程,rnn,cnn,lstm,激活函数,relu的优点,面向对象,装饰器,决策树,如何解决过拟合

     

一、推荐算法的理解

     推荐算法包括召回和排序阶段,

1.      召回:基于内容的推荐,协同过滤,社交网络的推荐,混合推荐等。

2.      排序阶段:LR,GBDT+LR,FM系列算法。

二、两个算法题:

   1)数组长度99,每个元素值1-100,如何找到1-100中哪个值没有出现?

    答:通过交换,将元素1放在索引为0的位置,元素2放在索引为1的位置。。。依次类推。

    问:有没有更优的解法

    答:每个元素值1-100,通过1-100求和数组求和就是缺失值。

  2)求ann次方?

   答:两种解法,第一种是减治法,如果n==0,返回1,如果n==1,返回a,如果n是偶数,$a^{n}=(a^{\frac{n}{2}})^{2}$,如果n是奇数,$a^{n}=a(a^{\frac{n-1}{2}})^{2}$

第二种解法,动态规划,分配数组array长度为$\frac{n}{2}+1$,arra[0]=1,array[1]=a,递推公式:如果n是偶数,$a[n]=(a[\frac{n}{2}])^{2}$,如果n是奇数,$a[n]=a(a[\frac{n-1}{2}])^{2}$,所以只需要求出$a[\frac{n}{2}]$即可解出a[n],递推式也可以写做:a[n]=a[m]+a[n-m]。

 三、l1l2正则化的对比:       

  1. l1:在使用LR进行特征选择时,l1正则化会把无关特征标注为0,但l1很不稳定,如果特征集合中具有相关联的特征,当数据发生细微变化时,可能导致很大的模型差异。
  2. l2l2正则化会让系数的取值变得平均,对于特征来说是一种比较稳定的模型。

      l1l2为什么导致这种差异呢?

       答:举两个特征的例子

  1. l1在二维坐标轴上就是一个矩形,当模型进行优化寻找最优点时,loss(无正则项)与l1图形首次相交的地方就是最优解,而loss与这些角的接触几率远大于内部,所以l1会有许多权值为0
  2. l2在二维坐标值是一个圆,与方形相比,内部被接触的几率更多,所以l2不会产生许多0

四、GBDTXGBOOST的区别:

  1. GBDT是对树的残差,XGBOOST把对树的残差转为为对树种节点的残差。
  2. GBDT是一阶泰勒展开,XGBOOST是二阶泰勒展开,相对精度更高。
  3. GBDT使用梯度下降优化,XGBOOST使用牛顿法优化。

五、梯度下降和牛顿法

  1. 梯度下降:循环曲线的最优解,通常是沿着当前梯度方向的负梯度、    
  2. 牛顿法:牛顿法原理:最优解的点为一阶导数为0时取得,即寻找${f}'(x)=0$的根,但并不是所有的方程都有求根公式,所以此时可以利用牛顿法。       

      具体过程如下:

          利用泰勒公式,在x0处展开,展开到二阶:

$f(x+\Delta x)=f(x)+f^{'}(x)\Delta x+\frac{1}{2}f^{"}(x)\Delta x^{2}$

    

    上述式子成立,当且仅当$\Delta x\rightarrow 0$,又因为${f}'(x)=0$,上式等价于:

    $f^{'}(x)+f^{"}(x)\Delta x=0$

    求解:

    $\Delta x=-\frac{{f}'(x_{n})}{{f}''(x_{n})}$

    得出迭代式:

    $x_{n+1}=x_{n}-\frac{{f}'(x_{n}))}{{f}''(x_{n}))}$

五、线程与进程

  1. 线程是程序执行的最小单元,一个进程包含多个线程。
  2. 线程和进行的内存是什么样子的?一个进程内的线程共享内存资源,但每个进程都有各自的内存资源。       
  3. 进程与线程的通信问题。

a)      同一进程中的线程因属于同一地址空间,共享变量无须通信,但存在线程安全问题。

b)      进程的通信:指在不同进程之间传播或交互信息,一般是通过操作系统的公共区进行,需要操作系统调度,比较复杂。通信方式有:管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、SocketStreams等。其中SocketStreams支持不同主机上两个进程通信。

1.      管道,通常指无名管道,是Unix系统进程通信最古老的形式。

特点:  

a)    它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。

b)    它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。   

c)    它可以看成是一种特殊的文件,对于它的读写也可以使用普通的readwrite等函数。但是它不是普通文件,并不属于其他任何文件系统,并且只存在于内存中。

2.      FIFO,也称为命名管道,它是一种文件类型。

特点: 

a)      FIFO可以在无关到晋城之间交换数据,与无名管道不同。

b)      FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

3.      消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。

   特点:

a)      消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。

b)      消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。

c)      消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

4.      信号量,是一个计数器,用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

特点:

a)      信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。

b)      信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。

c)      每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。

d)      支持信号量组。

5.      共享内存,指两个或多个进程共享一个给定的存储区。

特点:

a)      共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。

b)      因为多个进程可以同时操作,所以需要进行同步。

c)      信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

五种通讯方式总结 

1.管道:速度慢,容量有限,只有父子进程能通讯    

2.FIFO:任何进程间都能通讯,但速度慢    

3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题    

4.信号量:不能传递复杂消息,只能用来同步    

5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存。

六、rnn如何解决梯度消失和梯度爆炸

  1.梯度爆炸:通常采用截断来解决,对梯度值进行缩放,使得梯度的模不超过$\eta$ 。假设g是梯度向量$|g|>\eta$ ,那么:

          $g=\frac{\eta g}{|g|}$

  2.梯度消失:一种有效的办法是把RNN从$h_{t}=f(h_{t-1},x_{t})$改成累加模型:

          $h_{t}=h_{t-1}+f(h_{t-1},x_{t})$

    3.使用LSTM,可以通过遗忘门来解决。

 

七、Relu的优点

       1.其他激活函数在自变量取无穷大时,斜率会接近于0,导致梯度下降算法参数更新速度减慢,而Relu在自变量大于0时导数为1,可以解决这个问题。

       2.relu不会出现梯度消失和梯度爆炸(确切的讲是leak relu)。

 

八、装饰器的作用

    当一个函数功能已经写好,后期不想修改时,但需要增加额外功能时可以使用装饰器。

九、决策树的分裂点

    ID3,C4.5,Gini指数。

十、如何解决过拟合

     1.早停。

     2.通过正则化或者dropout。

     3.数据样本不均衡,采用过采样、重采样、调节权重。

     4.使用Batch_Normailzation。

     5.更换模型。

     6.集成学习的方式。

     7.权值共享最常见的就是在卷积神经网络中,权值共享的目的旨在减小模型中的参数,同时还能较少计算量。在循环神经网络中也用到了权值共享。

     8.增加噪声。这也是深度学习中的一种避免过拟合的方法(没办法,深度学习模型太复杂,容易过拟合),添加噪声的途径有很多,可以在输入数据上添加,增大数据的多样性,可以在权值上添加噪声,这种方法类似于L2正则化。

 

posted @ 2019-08-30 18:56  訫无杂念  阅读(160)  评论(0)    收藏  举报