Title: 深入机器学习的梯度优化 · Issue #51 · aialgorithm/Blog · GitHub
Open Graph Title: 深入机器学习的梯度优化 · Issue #51 · aialgorithm/Blog
X Title: 深入机器学习的梯度优化 · Issue #51 · aialgorithm/Blog
Description: 简介 机器学习在选定模型、目标函数之后,核心便是如何优化(目标)损失函数。而常见的优化算法中,有梯度下降、遗传算法、模拟退火等算法,其中用梯度类的优化算法通常效率更高,而使用也更为广泛。接下来,我们从梯度下降(Gradient descent)、梯度提升(Gradient Boosting)算法中了解下“梯度”优化背后的原理。 一、梯度 我们先引出梯度的定义: 梯度是一个矢量,其方向上的方向导数最大,其大小正好是此最大方向导数 简单对于二维的情况,梯度也就是曲线上某点的...
Open Graph Description: 简介 机器学习在选定模型、目标函数之后,核心便是如何优化(目标)损失函数。而常见的优化算法中,有梯度下降、遗传算法、模拟退火等算法,其中用梯度类的优化算法通常效率更高,而使用也更为广泛。接下来,我们从梯度下降(Gradient descent)、梯度提升(Gradient Boosting)算法中了解下“梯度”优化背后的原理。 一、梯度 我们先引出梯度的定义: 梯度是一个矢量,其方向上的方向...
X Description: 简介 机器学习在选定模型、目标函数之后,核心便是如何优化(目标)损失函数。而常见的优化算法中,有梯度下降、遗传算法、模拟退火等算法,其中用梯度类的优化算法通常效率更高,而使用也更为广泛。接下来,我们从梯度下降(Gradient descent)、梯度提升(Gradient Boosting)算法中了解下“梯度”优化背后的原理。 一、梯度 我们先引出梯度的定义: 梯度是一个矢量,其方向上的方向...
Opengraph URL: https://github.com/aialgorithm/Blog/issues/51
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"深入机器学习的梯度优化","articleBody":"## 简介\r\n机器学习在选定模型、目标函数之后,核心便是如何优化(目标)损失函数。而常见的优化算法中,有梯度下降、遗传算法、模拟退火等算法,其中用梯度类的优化算法通常效率更高,而使用也更为广泛。接下来,我们从梯度下降(Gradient descent)、梯度提升(Gradient Boosting)算法中了解下“梯度”优化背后的原理。\r\n\r\n## 一、梯度\r\n我们先引出梯度的定义:\r\n\u003e梯度是一个矢量,其方向上的方向导数最大,其大小正好是此最大方向导数\r\n\r\n简单对于二维的情况,梯度也就是曲线上某点的切线斜率,数值就是该曲线函数的导数,如y=x^2^ ,求导dy/dx=2x\r\n\r\n扩展到3维(多维),各点方向导数是无限多(一个平面),梯度也就是方向导数最大的方向,数值即对多元函数各参数求偏导数,如y=x^2^ + 3z^2^ ,求x偏导dy/dx=2x,求z偏导dy/dz=6z。\r\n\r\n\r\n换句话说,沿着函数(曲线)的任意各点位置取梯度相反的方向,如y=x^2^ + 3z^2^ 的负梯度-(2x, 6z),也就是多元函数下降最快的地方,越容易找到极值。这也就是梯度下降算法的基本思想。\r\n\r\n## 二、梯度下降算法\r\n\r\n### 2.1 梯度下降的基本原理\r\n梯度类的优化算法,最为常用的就是随机梯度下降,以及一些的升级版的梯度优化如“Adam”、“RMSP”等等。\r\n\r\n\r\n如下介绍梯度下降算法的基本原理:\r\n\r\n首先可以将损失函数J(w)比喻成一座山,我们的目标是到达这座山的山脚(即求解出最优模型参数w使得损失函数为最小值)\r\n\r\n\r\n这时,梯度下降算法可以直观理解成一个下山的方法。\r\n\r\n\r\n下山要做的无非就是“往下坡的方向走,走一步算一步”,而在损失函数这座山上,每一位置的下坡的方向也就是它的负梯度方向(直白点,也就是山各点位置的斜向下的方向)。每往下走到一个位置的时候,代入当前样本的特征数据求解当前位置的梯度,继续沿着最陡峭最易下山的位置再走一步。这样一步步地走下去,一直走到山脚(或者山沟沟)。\r\n\r\n\r\n当然这样走下去,有可能我们不是走到山脚(全局最优,Global cost minimun),而是到了某一个的小山谷(局部最优,Local cost minimun),这也后面梯度下降算法的可进一步调优的地方。对应的算法步骤,直接截我之前的图:\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n与梯度下降一起出现的还有个梯度上升,两者原理一致,主要是术语的差异。简单来说,对梯度下降目标函数取负数,求解的是局部最大值,相应需要就是梯度提升法。\r\n\r\n\r\n### 2.2 梯度下降的数学原理——泰勒展开\r\n本节会通过泰勒展开定理,\"推导\"得出梯度下降\r\n\r\n首先引出泰勒展开原理,它是种计算函数某点的近似值的方法,通过多个多项式拟合某一函数f(x)。泰勒多项式展开的项数越多,拟合的越好\r\n\r\n\r\n- 1、回到我们的损失函数J,做个一阶的泰勒展开近似:(其中θ-θ0越小越近似)\r\n\r\n- 2 其中θ−θo是微小矢量,做一下变换,θ-θ0以λ*d替代(λ为向量长度,d为单位向量),可得:\r\n\r\n- 3、计算后式的向量乘积,可得:(theta为梯度与d向量的夹角)\r\n\r\n\r\n\r\n- 4、上式中,我们希望J(θ) 越小越好,而J(θo)为常量,所以我们希望后项越小越好,当cos(180)=-1可以取到最小值,意味着梯度与d单位向量的夹角为相反的,也就是需要d为负梯度方向:\r\n\r\n- 5、进一步的,将d代入式子:θ-θo = λ*d,就可以得到梯度下降公式的雏形(其中λ及1/||J'||为常数可以改写为常用的学习率α),优化后的θ也就是:\r\n\r\n\r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n## 三、梯度提升算法\r\n\r\n说到梯度提升(Gradient Boosting),要注意的是和上文谈到的梯度上升不是一个概念。\r\n\r\n\r\n梯度提升是一种加法模型思想(Fm = Fm-1 + hm, 同上泰勒定理,hm应为负梯度),不像梯度下降直接利用负梯度更新模型参数,梯度提升是通过各弱学习器去学习拟合负梯度的,在进一步累加弱学习器,来实现损失函数J的负梯度方向优化。\r\n\r\n\r\n\r\n梯度提升算法很像是一个“打高尔夫,不断补杆”的过程,基本思路是弱学习器一个接着学习上一个学习器的残差或负梯度(没学习好的内容),最终得到m个弱学习器h0..hm一起决策。(**注:对于平方损失函数, 其负梯度刚好等于残差。我们通过直接拟合负梯度可以扩展到更为复杂的损失函数。**)\r\n\r\n\r\n举个简单例子,假如我们的目标值是【100】,当第一个弱学习器h0学习目标值100,实际输出y^只有【60】,和实际y还是有偏差的,残差值y^ - y,第二个学习器h1继续学习拟合之前的残差(或者负梯度),学习剩下的【100-60】,并实际输出【50】...依次学习到第h2个弱学习器拟合之前的残差【100-60-50】,这时比较准确地输出【-10】,达到较好的拟合结果,算法结束。整个模型的表示就是Fm = h0 + h1 + h2 = 60 + 50 - 10 =\u003e 100。如下图具体算法:\r\n\r\n### 后记\r\n在优化领域,梯度优化方法无疑是简单又极有效率的,但不可避免的是它通常依赖着有监督标签,且得到的是近似最优解。不可否认,在优化的道路上,我们还有很长的一段路要走。\r\n\r\n---\r\n\r\n\u003e参考文献:\r\nhttps://zhuanlan.zhihu.com/p/45122093\r\nhttps://zhuanlan.zhihu.com/p/82757193\r\nhttps://www.zhihu.com/question/63560633","author":{"url":"https://github.com/aialgorithm","@type":"Person","name":"aialgorithm"},"datePublished":"2022-05-16T10:36:14.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/51/Blog/issues/51"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:15e0abd3-5b40-15be-2c57-a69b59978ccc |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | B868:309720:7A9999:AAC82E:696A7F82 |
| html-safe-nonce | 74cb8858edd55388b899654419637a6b8f8b304a2949566bade5114c09d42f28 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCODY4OjMwOTcyMDo3QTk5OTk6QUFDODJFOjY5NkE3RjgyIiwidmlzaXRvcl9pZCI6Ijc3MTU5NzExMzM0MzI1NjE1MzgiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 3953799aad6a6cd31805089130e7f1755c0c707fbd5da196b5bdeb3031d3fefa |
| hovercard-subject-tag | issue:1236955118 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/aialgorithm/Blog/51/issue_layout |
| twitter:image | https://opengraph.githubassets.com/42ee79cf9b0a5d7397f7d3f80ca7010ccbe6437f5d9da3430fd03699dd443be8/aialgorithm/Blog/issues/51 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/42ee79cf9b0a5d7397f7d3f80ca7010ccbe6437f5d9da3430fd03699dd443be8/aialgorithm/Blog/issues/51 |
| og:image:alt | 简介 机器学习在选定模型、目标函数之后,核心便是如何优化(目标)损失函数。而常见的优化算法中,有梯度下降、遗传算法、模拟退火等算法,其中用梯度类的优化算法通常效率更高,而使用也更为广泛。接下来,我们从梯度下降(Gradient descent)、梯度提升(Gradient Boosting)算法中了解下“梯度”优化背后的原理。 一、梯度 我们先引出梯度的定义: 梯度是一个矢量,其方向上的方向... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | aialgorithm |
| hostname | github.com |
| expected-hostname | github.com |
| None | 913560fa317c3c5a71e34f9b19253c9f09d02b4b958a86c2a56f4c8541116377 |
| turbo-cache-control | no-preview |
| go-import | github.com/aialgorithm/Blog git https://github.com/aialgorithm/Blog.git |
| octolytics-dimension-user_id | 33707637 |
| octolytics-dimension-user_login | aialgorithm |
| octolytics-dimension-repository_id | 147093233 |
| octolytics-dimension-repository_nwo | aialgorithm/Blog |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 147093233 |
| octolytics-dimension-repository_network_root_nwo | aialgorithm/Blog |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 5998c30593994bf2589055aef7b22d368a499367 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width