データセットに100万の例、つまりおり、勾配降下を使用してこれらのデータセットでロジスティック回帰または線形回帰を実行するとします。
非効率にする勾配降下法とは何ですか?
時間での勾配降下ステップは次の式で与えられることを思い出してください。
ここで、は損失関数です。
上記の手順でアルゴリズムが非効率になる原因となる異常は見当たりません。の計算ですか?この操作は事前に計算できませんでした。つまり、各すでに計算されていて、各データポイントで単純に評価できませんでした∂ F XI?
データセットに100万の例、つまりおり、勾配降下を使用してこれらのデータセットでロジスティック回帰または線形回帰を実行するとします。
非効率にする勾配降下法とは何ですか?
時間での勾配降下ステップは次の式で与えられることを思い出してください。
ここで、は損失関数です。
上記の手順でアルゴリズムが非効率になる原因となる異常は見当たりません。の計算ですか?この操作は事前に計算できませんでした。つまり、各すでに計算されていて、各データポイントで単純に評価できませんでした∂ F XI?
回答:
勾配降下が非効率的であるという主張にコンテキストを提供すると役立ちます。何に対して非効率ですか?
ここで欠けているコンテキストは、機械学習における確率的またはバッチ勾配降下法との比較だと思います。このコンテキストで質問に答える方法は次のとおりです。ハイパーパラメーターも含め、モデルのパラメーターを最適化しています。したがって、コスト関数があります。ここで、データ、およびパラメータのベクトル、および -損失関数です。このコストを最小化するには、パラメーター勾配降下法を使用します: X I Θ L ()θのjは∂
したがって、すべてのデータの合計を取得する必要があることがわかります。残念ながら、これは勾配降下の各ステップでデータをループし続けるためです。これが、バッチおよび確率的勾配降下法です。データセットからサンプリングし、完全なセットではなくサンプルの勾配を計算した場合はどうでしょうか。 ここで、はサンプル観測数です。したがって、サンプルが合計セットの100分の1であれば、計算を100倍高速化できます!明らかに、これは学習を長引かせるノイズを導入しますが、ノイズは割合で減少します∂NSS√
代わりに、合計が計算されるまで待つ代わりに、これをバッチに分割し、各バッチにステップを実行することもできます。これにより、データセット全体の合計が計算されるまでにMステップを実行できます。これらはノイズの多いステップですが、ノイズは時間の経過とともにキャンセルされます。 ∑ M s = 1 ∑ n s i s = 1
勾配降下が非効率になる可能性のある方法は2つあります。興味深いことに、それらはそれぞれ独自の修正方法につながりますが、これはほぼ反対の解決策です。2つの問題は次のとおりです。
(1)勾配降下の更新が多すぎます。
(2)各勾配降下ステップは非常に高価です。
(1)に関して、勾配降下法を2次導関数に関する情報を考慮した方法と比較すると、勾配降下法は各反復での損失の改善に関して非常に非効率になる傾向があります。非常に標準的な方法であるニュートン法は、一般に収束するのにはるかに少ない反復を必要とします。つまり、ロジスティック回帰の場合、ニュートン法の10回の反復は、勾配降下の5,000回の反復によって提供されるソリューションよりも損失が少ないことがよくあります。線形回帰の場合、これはさらに極端です。閉じた形式のソリューションがあります!ただし、予測子の数が非常に多くなると(つまり500 +)、Newtonの方法/線形回帰の直接解法は、反復ごとに非常に高価になる可能性があります。 必要な行列演算の量により、勾配降下は反復あたりのコストがかなり低くなります。
(2)に関しては、勾配降下の各反復が計算するには高すぎるほど大きなデータセットを持つことが可能です。勾配の計算には操作が必要です( =サンプルサイズ、 =共変量の数)。ながらの値について現代のコンピュータ上のすべてに問題ではありませんのような確かに、、あろう。この場合、確率的勾配降下法など、データの小さなサブセットに基づいて導関数を近似する方法がより魅力的です。n
これらの修正はほぼ正反対で、ニュートンの方法のようなものは更新ごとに費用がかかりますが(損失の変化の観点から)より効率的であり、一方、確率的勾配降下は実際には効率的ではありませんが、更新ごとにはるかに計算的に安価です。
簡単な答え:勾配を計算するには、すべてのデータポイントを合計する必要があります。大量のデータがある場合、時間がかかります。
ここに詳細な回答があります。
確率的勾配降下は、標準の勾配降下と比較して、どのように時間を節約できますか?
一方、反復法(勾配まとも)に加えて直接法があることに常に留意してください。最小二乗問題を解決したい場合、直接法は非常に効率的です。たとえば、QR分解。機能が多すぎない場合は、非常に高速です。
検証すると、驚かれるかもしれません。2つの機能を備えた500万のデータポイント、線形回帰/最小二乗を解くには数秒かかります。
x=matrix(runif(1e7),ncol=2)
y=runif(5e6)
start_time <- Sys.time()
lm(y~x)
end_time <- Sys.time()
end_time - start_time
# Time difference of 4.299081 secs
あなたが言及した2つの例は通常凸型ですが、非凸問題について1点追加します。私の意見では、(バッチ)勾配降下が「非効率的」と見なされる主な理由は2つあります。関数の「大きな」合計の勾配を計算する計算の労力に関する最初のポイントは、他の回答ですでに非常に明確に概説されています。ただし、凸でない問題の場合、GDには通常、「近い」ローカルミニマムで立ち往生するという問題があります。この最小値は、グローバルな最小値と比較して非常に悪い場合があります。SGDまたはミニバッチGDには、(少なくとも部分的に)ランダムに歩き回る「利点」があるため、より良いローカルミニマムを見つける可能性があります。こちらのこの履歴書の回答をご覧ください。またはこの他の履歴書投稿 ランダム性がどのように有益であるかを概説します。