常用优化器(Adam SGD)算法

17 篇文章 1 订阅
订阅专栏

概览

梯度下降算法
在这里插入图片描述
关于梯度下降算法的直观理解,我们以一个人下山为例。比如刚开始的初始位置是在红色的山顶位置,那么现在的问题是该如何达到蓝色的山底呢?按照梯度下降算法的思想,它将按如下操作达到最低点:

  1. 明确自己现在所处的位置
  2. 找到相对于该位置而言下降最快的方向
  3. 沿着第二步找到的方向走一小步,到达一个新的位置,此时的位置比原来低
  4. 回到第一步
  5. 终止于最低点

按照以上5步,最终达到最低点,这就是梯度下降的完整流程。当然你可能会说,上图不是有不同的路径吗?是的,因为上图并不是标准的凸函数,往往不能找到最小值,只能找到局部极小值。所以你可以用不同的初始位置进行梯度下降,来寻找更小的极小值点,因为网络的目标函数往往不满足 严格的凸函数,所以可能从不同的初始值出发可能达到不同的局部最小值。

pytorch 提供的优化器接口

from .adadelta import Adadelta  # noqa: F401
from .adagrad import Adagrad  # noqa: F401
from .adam import Adam  # noqa: F401
from .adamw import AdamW  # noqa: F401
from .sparse_adam import SparseAdam  # noqa: F401
from .adamax import Adamax  # noqa: F401
from .asgd import ASGD  # noqa: F401
from .sgd import SGD  # noqa: F401
from .rprop import Rprop  # noqa: F401
from .rmsprop import RMSprop  # noqa: F401
from .lbfgs import LBFGS  # noqa: F401

SGD (Stochastic gradient descent)

θ = θ − ∇ θ J ( θ ) \theta = \theta - \nabla_\theta J(\theta) θ=θθJ(θ)

  • 批量梯度下降
    针对整个数据集进行梯度的计算,可以求得全局最优解,但是当数据集比较大时,计算开销大,计算速度慢

  • 随机梯度下降
    每次只通过随机选取的数据对 ( x i , y i ) (x^i,y^i) (xi,yi)来求梯度,计算速度快,但是由于每次只选取一个样本对进行更新,很可能导致 损失函数震荡的现象,不易收敛。

  • 小批量梯度下降
    每次选择一个批量(btach)样本进行更新,折中方案 1. 减少了参数更新的变化,这可以带来更加稳定的收敛。2:可以充分利用矩阵优化,最终计算更加高效。

在这里插入图片描述

Momentum

通过使用动量,减缓目标函数的震荡,加快收敛速度。

在这里插入图片描述

pytorch实现

# dampening一般为0
for p in group['params']:
   if p.grad is None:
       continue
   d_p = p.grad.data
   if weight_decay != 0:
       d_p.add_(weight_decay, p.data)
   if momentum != 0:
       param_state = self.state[p]
       if 'momentum_buffer' not in param_state:
           buf = param_state['momentum_buffer'] = torch.clone(d_p).detach()
       else:
           buf = param_state['momentum_buffer']
           buf.mul_(momentum).add_(1 - dampening, d_p)
       if nesterov:  # NAG
           d_p = d_p.add(momentum, buf)
       else:
           d_p = buf

   p.data.add_(-group['lr'], d_p)

V t = V t − 1 + ∇ θ J ( θ ) V_t = V_{t-1} + \nabla_\theta J(\theta) Vt=Vt1+θJ(θ)
θ = θ − V t \theta = \theta-V_t θ=θVt

NAG(Nesterov accelerated gradient)

该优化器相对于Momentum,唯一不同的是计算反向梯度的时机。

V t = V t − 1 + ∇ θ J ( θ + V t − 1 ) V_t = V_{t-1} + \nabla_\theta J(\theta+V_{t-1}) Vt=Vt1+θJ(θ+Vt1)
θ = θ − V t \theta = \theta-V_t θ=θVt

Momentum 在当前位置上求梯度,但是NAG是在上个动量的方向上前进一小步,然后再计算梯度,相当于:
上次是往前走了10米,这次我先往前走上2米,然后再来观察下一步怎么走。可以认为是分两步更新了theta。

AdaGrad

Adagrad优化算法是一种自适应优化算法,针对高频特征更新步长较小,而低频特征更新较大。因此该算法适合应用在特征稀疏的场景。

先前的算法对每一次参数更新都是采用同一个学习率,而adagrad算法每一步采用不同的学习率进行更新,衰减系数是 历史所有梯度的平方和。我们计算梯度的公式如下:
在这里插入图片描述
在这里插入图片描述

state['sum'].addcmul_(1, grad, grad)  # s = s + grad * grad
std = state['sum'].sqrt().add_(group['eps'])  # d = sqrt( s + eps)
p.data.addcdiv_(-clr, grad, std)   # p = p - lr/d * grad

Adagrad算法的主要优点是它避免了手动调整学习率的麻烦,大部分的实现都采用默认值0.01。

分析

  1. 从AdaGrad算法中可以看出,随着算法不断迭代,r会越来越大,整体的学习率会越来越小。所以,一般来说AdaGrad算法一开始是激励收敛,到了后面就慢慢变成惩罚收敛,速度越来越慢。
  2. 在SGD中,随着梯度的增大,我们的学习步长应该是增大的。但是在AdaGrad中,随着梯度g的增大,我们的r也在逐渐的增大,且在梯度更新时r在分母上,也就是整个学习率是减少的,这是为什么呢?
    这是因为随着更新次数的增大,我们希望学习率越来越慢。因为我们认为在学习率的最初阶段,我们距离损失函数最优解还很远,随着更新次数的增加,越来越接近最优解,所以学习率也随之变慢。
  3. 经验上已经发现,对于训练深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。AdaGrade在某些深度学习模型上效果不错,但不是全部。
  • dagrad算法主要的缺点在于,其分母梯度平方的累加和。因为每次加入的都是一个正数,随着训练的进行,学习率将会变得无限小,此时算法将不能进行参数的迭代更新。

RMSPro Adadelta

这两者都是基于Adagrad的基础进行改进,主要是通过不同的方法 解决adagrad导致的学习趋近于零**(学习率消失)**,网络不学习的问题 。

通过约束历史梯度累加来替代累加所有历史梯度平方。这里通过在历史梯度上添加衰减因子,并通过迭代的方式来对当前的梯度进行计算,最终距离较远的梯度对当前的影响较小,而距离当前时刻较近的梯度对当前梯度的计算影响较大,公式

S t = m ∗ S t − 1 + ( 1 − m ) ∗ g r a d ∗ g r a d S_t = m*S_{t-1} + (1-m)*grad*grad St=mSt1+(1m)gradgrad

随着网络更新,之前保留的梯度对 当前的下降方向 影响已经很小了,所以将累加的 梯度和 乘以 衰减系数, 权重梯度基于最近量级的均值为每一个参数适应性地保留学习率。

square_avg.mul_(alpha).addcmul_(1 - alpha, grad, grad) # s = a*s + (1-a)*g*g

Adam

Adam 则是 结合了 自适应学习策略Adagrad 和 Momentum的更新思想

Adam 算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率(即 alpha)更新所有的权重,学习率在训练过程中并不会改变。而 Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率 Adam 算法的提出者描述其为两种随机梯度下降扩展式的优点集合,即:

  • 适应性梯度算法(AdaGrad)为每一个参数保留一个学习率以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能。

  • 均方根传播(RMSProp)基于权重梯度最近量级的均值为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能。

Adam 算法同时获得了 AdaGrad 和 RMSProp 算法的优点。Adam 不仅如 RMSProp 算法那样基于一阶矩均值计算适应性参数学习率,它同时还充分利用了梯度的二阶矩均值(即有偏方差/uncentered variance)。具体来说,算法计算了梯度的指数移动均值(exponential moving average),超参数 beta1 和 beta2 控制了这些移动均值的衰减率。移动均值的初始值和 beta1、beta2 值接近于 1(推荐值),因此矩估计的偏差接近于 0。该偏差通过首先计算带偏差的估计而后计算偏差修正后的估计而得到提升。

在这里插入图片描述

在这里插入图片描述

存在的问题:

  • 可能不收敛
    对于SGD和AdaGrad来说,其学习率都是单调的,即单调递减,因此,这两类算法会使得学习率不断递减,最终收敛到0,模型也得以收敛。
    但是对于Adam和AdaDelta,其学习率二阶估计是取固定时间窗口内的动量累加,随着窗口和数据的变化,二阶动量可能会产生的波动,从而引起学习率震荡,导致模型无法收敛;

在这里插入图片描述

  • 可能错过全局最优解

另外一篇是 ImproVing Generalization Performance by Switching from Adam to SGD,进行了实验验证。他们CIFAR-10数据集上进行测试,Adam的收敛速度比SGD要快,但最终收敛的结果并没有SGD好。他们进一步实验发现,主要是后期Adam的学习率太低,影响了有效的收敛。他们试着对Adam的学习率的下界进行控制,发现效果好了很多。

于是他们提出了一个用来改进Adam的方法:前期用Adam,享受Adam快速收敛的优势;后期切换到SGD,慢慢寻找最优解。这一方法以前也被研究者们用到,不过主要是根据经验来选择切换的时机和切换后的学习率。这篇文章把这一切换过程傻瓜化,给出了切换SGD的时机选择方法,以及学习率的计算方法,效果看起来也不错。

在这里插入图片描述

参考资料:
都9102年了,别再用Adam + L2 regularization了
优化方法总结以及Adam存在的问题

优化器SGDAdam和AdamW的区别和联系
weixin_44902604的博客
02-18 5794
优化器是用来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值,从而最小化(或最大化)损失函数。
SGDAdam,AdamW,LAMB优化器
flyingluohaipeng的博客
03-31 6836
BERT 预训练包括两个阶段:1)前 9/10 的训练 epoch 使用 128 的序列长度,2)最后 1/10 的训练 epoch 使用 512 的序列长度。优化器是用来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值,从而最小化(或最大化)损失函数。优点: 简单性,在优化算法中没有太多的参数需要调整,通过少量的计算量就可以获得比较好的结果。为预先设定的超参数,分别代表参数调整的下界和上界。这一简单的调整所带来的实际效果非常显著。随机梯度下降是最简单的优化器,它采用了简单的梯度下降法,
【深度学习】Adam真的是最好的优化器吗?
最新发布
fengdu78的博客
04-24 243
仅作学术分享,不代表本公众号立场,侵权联系删除转载于:机器之心提到优化器,大多数人会想到 Adam。自 2015 年推出以来,Adam 一直是该领域的「王者」。但近日,波士顿大学的一位助理教授做出了一个假设,他认为 Adam 或许不是最佳的优化器,只是神经网络的训练使其成为了最佳。Adam 优化器是深度学习中最流行的优化器之一。它适用于很多种问题,包括带稀疏或带噪声梯度的模型。其易于精调的特性使得...
Adam优化器总结
不佛的博客
08-30 2万+
根据李宏毅老师的课程,将梯度下降的学习策略和优化器部分做一个梳理。 梯度下降的基本方法是:朝着参数θ\thetaθ的当前梯度ggg的反方向,以η\etaη为步长迈出一步。 一个常见的问题就是如何保证不会落入局部最小值,因此有了Momentum(动量) 的概念。仿照现实世界中物体的惯性,在运动时不仅要看当前这一步往哪里迈,还要考虑之前的运动状态,如果之前的步伐很快,就不应该在一步内急停或者急转弯。这样做的好处是可以跳出一些小坑(局部最小值)。 动量的实现方法也不复杂,就是将前一步的步伐mmm乘上一个参数λ
SGD、Momentum、 AdaGrad、Adam
A496608119的博客
04-08 1910
目录 1.SGD 1.1 SGD的缺点 2. Momentum 3. AdaGrad 4. Adam 5 使用哪种更新方法呢 神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化(optimization)。遗憾的是,神经网络的最优化问题非常难。 为了找到最优参数,我们将参数的梯度(导数)作为了线索。使用参数的梯度,沿梯度方向更新参数,并重复这个步骤多次,从而逐渐靠近最优参数,这个过程称为随机梯度下降法(stochastic gradie
svm sgd matlab,基于SGD、ASGD算法的SVM分类器(OpenCV案例源码train_svmsgd.cpp解读)
weixin_35974217的博客
03-25 332
此案例用于二分类问题(鼠标左键、右键点出两类点,会实时画出分界线),最终得到一条分界线(直线):f(x)=weights*x+shift源码不再贴出,只讲解最核心的doTrain()里的内容。参数含义翻译自ml.hpp文件。与SVM不同,SVMSGD不需要设置核函数。【参数】默认值见下述代码模型类型:SGD、ASGD(推荐)。随机梯度下降、平均随机梯度下降。边界类型:HARD_MARGIN、SOF...
swats:在PyTorch中非官方实现从Adam切换到SGD优化
05-02
Adam切换到SGD 表明:“即使在自适应解决方案具有更好的训练性能的情况下,通过自适应方法发现的解决方案的普遍性也比SGD差(通常显着更差)。这些结果表明,从业者应该重新考虑使用自适应方法来训练神经网络。 ...
收藏 _ 深度学习优化算法:从SGDAdamW原理和代码解读1
08-04
可打印版本附pdf下载链接本思想来下这篇佬的章:Juliuszh:个框架看懂优化算法之异同 SGD/AdaGrad/Adam主要是对深度学习各种优化器 (从SG
RadioMLtrainer_网络优化_ADAM_
09-30
属于神经网络中的一种优化算法,是一中较SGD更好的方法
深度学习常用优化算法研究.pdf
08-18
这些算法都有其特点和优势,例如SGD算法可以加速收敛速度,Adam算法可以自适应地调整学习率等。 在实际问题中,选择合适的优化算法是非常重要的。不同的优化算法在不同的问题和模型下可能具有不同的性能。因此,...
Matlab代码,里面包括五种常见神经网络优化算法的对比 包括SGDSGDM、Adagrad、AdaDelta、Adam
03-02
SGDSGDM、Adagrad、AdaDelta 和 Adam 的简介: SGD(Stochastic Gradient Descent,随机梯度下降)是神经网络中最基本的优化算法之一。它通过随机选择一小部分样本进行训练,并基于这些样本的梯度来更新模型参数...
pytorch优化器详解:SGD
weixin_39228381的博客
08-31 5万+
说明 模型每次反向传导都会给各个可学习的参数p计算出一个偏导数,用于更新对应的参数p。通常偏导数不会直接作用到对应的参数p上,而是通过优化器做一下处理,得到一个新的值,计算过程用函数F表示(不同的优化器对应的F的内容不同),即,然后和学习率lr一起作用于可学习参数p,即。 SGD参数 SGD是随机梯度下降(stochastic gradient descent)的首字母。 torch.optim.SGD(params, lr=<required paramet
BATCH_SIZE大小设置对训练耗时的影响
あずにゃん梓喵的博客
07-28 4273
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) BATCH_SIZE大小设置对训练耗时的影响: 1.如果当设置BATCH_SIZE等于训练样本时,比如训练样本有512个,设置BATCH_SIZE=512,那么一次BATCH_SIZE=512的批量数据进行训练时, 会计算BATC...
优化器SGD with Momentum
wekings的博客
03-25 1364
(1)指数加权平均:一种近似求平均的方法,公式如下: 代表局部的平均值。代表第t个数据的值。是可调节超参。可近似为前个数据的的平均值。 举例说明,设,则近似代表近10个数据的平均值: 指数递减的加权的移动平均,越近期的数据加权越大。对原始数据做了平滑,降低了原始数据的震荡成都,怎么看是前多少个数据的平均值呢,n通过得到。 (2)SGD with Momentum 采用上述指数加权平均的思路,在SGD中增加动量的概念,使得前几轮的梯度也会加入到当前的计算中(会有一定衰减),通过对前面一部分梯
Pytorch优化器全总结(一)SGD、ASGD、Rprop、Adagrad
热门推荐
xian0710830114的专栏
09-06 6万+
这是一个系列,以Pytorch为例,介绍所有主流的优化器,如果都搞明白了,对优化器算法的掌握也就差不多了。作为系列的第一篇文章,本文介绍Pytorch中的SGD、ASGD、Rprop、Adagrad,其中主要介绍SGDAdagrad。因为这四个优化器出现的比较早,都存在一些硬伤,而作为现在主流优化器的基础又跳不过,所以作为开端吧。
深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)...
weixin_34326179的博客
03-10 3157
在机器学习、深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下:https://arxiv.org/pdf/1609.04747.pdf 本文将梳理: 每个算法的梯度更新规则和缺点 为了应对这个不足而提出的下...
算法笔记】深度学习中的优化器Optimizer算法(BGD,SGD,mBGD......)
nymph_h的博客
07-07 1658
在阅读文献的时候,看到其中提到“选用了SGD左右优化器算法”,然后找到了这篇详尽地解释了各种优化器算法地文章: https://www.cnblogs.com/guoyaohua/p/8542554.html 文中提到的SGD指随机梯度下降法,每次迭代只使用一组训练数据,这样每次迭代不一定都朝着收敛方向去,但总体上是收敛的。 ...
【深度学习】常见优化算法
shenxiaolu1984的专栏
10-09 1万+
本文介绍常见数值优化算法,其中的一阶方法在现代的神经网络框架(tensorflow, torch)中已经是标准配置,介绍较详细。
pytorch-optimizer--优化算法
cris的博客
01-24 1504
1.SGD http://www.cs.toronto.edu/%7Ehinton/absps/momentum.pdf 使用Momentum/Nesterov实现SGD与Sutskever等人和其他一些框架中的实现有细微的不同 """ optimizer.SGD torch.optimizer.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False) 随机梯度下降法 主要参数:
adam优化器sgd优化器
05-27
Adam优化器SGD(Stochastic Gradient Descent)优化器是深度学习中常用的两种优化算法,它们有以下几个方面的不同: 1. 学习率:SGD优化器通常需要手动设置学习率,而Adam优化器可以自适应地调整每个参数的学习率,从而更好地适应不同参数的梯度变化情况。 2. 动量:SGD优化器可以使用动量来加速梯度下降过程,而Adam优化器不需要使用动量,因为它已经包含了一阶和二阶矩估计,可以自适应地调整每个参数的更新量。 3. 参数更新方式:SGD优化器的参数更新方式比较简单,只需要根据当前参数的梯度和学习率来更新参数;而Adam优化器需要维护每个参数的一阶和二阶矩估计,并根据这些估计来计算每个参数的更新量。 4. 计算量:由于Adam优化器需要维护每个参数的一阶和二阶矩估计,因此计算量比SGD优化器更大。 总体来说,Adam优化器相对于SGD优化器具有更快的收敛速度和更好的泛化性能,但计算量较大。在深度学习中,通常会使用Adam优化器作为默认的优化算法,但在某些情况下,SGD优化器也可能会更好地适应一些数据集和模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

分类专栏

  • Python 5篇
  • C++ 10篇
  • 环境配置 4篇
  • Pytorch_Mxnet 17篇
  • Algorithm 34篇

最新评论

  • pytorch 优化器(optim)不同参数组,不同学习率设置

    化茧成蝶梦成真: 博主,请教个问题,最后实现冻结和设置不同学习率的时候,不在SGD的参数组中出现的参数就默认是不更新了,是么?相当于冻结了?

  • vscode code runner配置

    66cc: Could not open input file: 星座查询.php 报这个错误,原来是路径错误,在vscode的code runner的扩展设置的executor map里,改成"php": "php $fullFileName",表情包

  • vscode code runner配置

    Stella Zhou: tasks.json和launch.json也适用于code runner吗?还是只适用于Python自带的调试器?

  • pytorch 优化器(optim)不同参数组,不同学习率设置

    qq_51722132: 如果要使用不同的优化器应该怎么办呢?

  • 347-前 K 个高频元素

    Tisfy: 这让我想起了先贤的一句话:我闭南楼看道书,幽帘清寂在仙居。

大家在看

  • 基于Python实现表白神器:一个浪漫的GUI应用程序
  • gcc与g++介绍
  • AcWing 1801:蹄子剪刀布 ← 模拟题 811
  • 汽车网络安全 -- 漏洞该如何管理
  • 线性代数2-矩阵

最新文章

  • torch 多进程训练(详细例程)
  • Python 多进程
  • c++ 个人汇总
2021年2篇
2020年37篇
2019年31篇
2018年6篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码大鹏网站建设设计坂田外贸网站建设荷坳百姓网标王丹竹头高端网站设计坪地网站搭建东莞网站推广观澜seo排名龙华百度网站优化排名福田建设网站深圳关键词按天扣费福田网站优化按天扣费丹竹头百度网站优化同乐模板推广龙岗网站推广东莞模板网站建设盐田网站优化排名深圳如何制作网站南澳外贸网站建设大浪建站横岗网站搭建深圳推广网站民治百搜标王光明SEO按天扣费石岩网站优化按天扣费大运百度爱采购永湖关键词排名沙井网页设计石岩网站推广方案双龙网站优化按天扣费大浪网站关键词优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化