京东第一次电面
问题包括:推荐算法,两个算法题,l1和l2正则化的对比,梯度下降和牛顿法,LR,GBDT和XGBOOST,线程和进程,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)求an的n次方?
答:两种解法,第一种是减治法,如果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]。
三、l1和l2正则化的对比:
- l1:在使用LR进行特征选择时,l1正则化会把无关特征标注为0,但l1很不稳定,如果特征集合中具有相关联的特征,当数据发生细微变化时,可能导致很大的模型差异。
- l2:l2正则化会让系数的取值变得平均,对于特征来说是一种比较稳定的模型。
l1和l2为什么导致这种差异呢?
答:举两个特征的例子
- l1在二维坐标轴上就是一个矩形,当模型进行优化寻找最优点时,loss(无正则项)与l1图形首次相交的地方就是最优解,而loss与这些角的接触几率远大于内部,所以l1会有许多权值为0。
- l2在二维坐标值是一个圆,与方形相比,内部被接触的几率更多,所以l2不会产生许多0。
四、GBDT与XGBOOST的区别:
- GBDT是对树的残差,XGBOOST把对树的残差转为为对树种节点的残差。
- GBDT是一阶泰勒展开,XGBOOST是二阶泰勒展开,相对精度更高。
- GBDT使用梯度下降优化,XGBOOST使用牛顿法优化。
五、梯度下降和牛顿法
- 梯度下降:循环曲线的最优解,通常是沿着当前梯度方向的负梯度、
- 牛顿法:牛顿法原理:最优解的点为一阶导数为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}))}$
五、线程与进程
- 线程是程序执行的最小单元,一个进程包含多个线程。
- 线程和进行的内存是什么样子的?一个进程内的线程共享内存资源,但每个进程都有各自的内存资源。
- 进程与线程的通信问题。
a) 同一进程中的线程因属于同一地址空间,共享变量无须通信,但存在线程安全问题。
b) 进程的通信:指在不同进程之间传播或交互信息,一般是通过操作系统的公共区进行,需要操作系统调度,比较复杂。通信方式有:管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上两个进程通信。
1. 管道,通常指无名管道,是Unix系统进程通信最古老的形式。
特点:
a) 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
b) 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
c) 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通文件,并不属于其他任何文件系统,并且只存在于内存中。
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正则化。

浙公网安备 33010602011771号