これは、会社のアルゴリズム グループの同僚向けに作成された技術ロードマップです。主な目的は、技術ルートの成長に向けた方向性のガイダンスを提供し、実践を通じて理解と習熟を深めることができるように自己評価項目を提供することです。 内容はある程度普遍的なものなので、Zhihu でも共有されています。ご提案は大歓迎です。間違いや抜けがある場合は、遠慮なくご指摘ください :) さまざまなレベルのアルゴリズム エンジニアに求められるスキルは、おおよそ次のレベルに分けられます。 初級: ある程度の指導と支援があれば、開発タスクを独力で完了できます。具体的には、アルゴリズムに関しては、ツール フレームワーク、モデリング手法、ビジネス特性などについて一定の理解を持ち、一部のアルゴリズム プロジェクト要件を独自に実装できる必要があります。 中級: 基本的にプロジェクトの開発と納品を独力で完了できます。ジュニアエンジニアの場合、技術原理の深い理解に対する要件がより高くなり、プロジェクトにおけるさまざまな複雑で変化する課題に対処し、既存のテクノロジーとツールを変革および適応できるようになります。全体的なエンジニアリングの提供に関しては、コード品質、アーキテクチャ設計、さらにはプロジェクト管理に対する要件が現れ始めます。さらに、ビジネスの観点からテクノロジーの選択とソリューションを評価することが特に重要です。 シニア: 製品ラインの運用を独立して担当できます。中堅エンジニアを基盤として、製品ライン全体の方向性を定義するには、より幅広い技術的ビジョンと先駆的かつ革新的な能力が必要です。問題を解決することはもはや重要ではありません。より重要なのは、問題を提起し、定義して、業界をリードする差別化された製品を生み出し、企業にさらなる価値を生み出すことです。
実際、さまざまなレベルのエンジニアにとって、非技術的な要件は一定の割合を占めています。この記事では主に技術的なロードマップに焦点を当てており、その他の高度な学習ルートについては取り上げません。 以下のコンテンツは、エンジニアリングの基礎、アルゴリズムの基礎、アルゴリズムとエンジニアリングの交差点、エンジニアリングの詳細方向、アルゴリズムの詳細方向のいくつかの部分に分かれています。各部分では、いくつかのトピックがさらに区別されます。各トピック内の深さのレベルにも違いがありますが、スペースの制限により詳細な説明は提供されません。推奨される学習ルートは、まず、仕事に関連性の高い内容で 2 つの基本部分の基盤をしっかりと築き、その後、横断的かつ詳細な方向で興味のあるトピックを選択して、深い理解と学習を進めることです。プロセスで基本部分が不足していることに気付いた場合は、基本部分に戻ってギャップを埋め、反復的に前進することができます。 Python は、アルゴリズム エンジニアの日常業務で最もよく使用される言語であり、習得しなければならないテクノロジと考えるべきです。一般的な学習ルートは次のとおりです。 Python の基本的な構文を学習して習得するには、さまざまな入門チュートリアルを読むことができます。個人的には、「Learn Python the Hard Way」をお勧めします。 自己評価: ほとんどの社内プロジェクトの基本モジュールと、pandas、sklearn などの一部のオープンソース プロジェクト コードを理解できる。 Python プログラミング スタイルを学習するには、Guanyuan の内部 Python コード標準を学習することをお勧めします。 自己評価: 記述されたコードはコーディング標準に準拠しており、さまざまな lint チェックに合格できます。 上級の Python については、「Fluent Python」という非常に有名な本があります。この本では、Python の多くの内部動作原理が詳しく紹介されています。この本を読めば、さまざまな難しい問題の理解とトラブルシューティング、および言語の高度な機能の適用に非常に役立ちます。また、動的言語のメタプログラミングについては、「Ruby Metaprogramming」も非常におすすめの本です。 自己評価: 複雑な Python プロジェクトを理解できるようになります。たとえば、sqlalchemy ではメタプログラミング手法が広範に使用されています。実際のエンジニアリング プロジェクトでは、Cython ベースのパフォーマンス最適化などの高度なテクニックの適用を実践するポイントがいくつかあります。 分野応用面ではPythonが幅広く活用されています。Web開発、クローラー、運用保守ツール、データ処理、機械学習など、それぞれの分野を深掘りすると学ぶことがたくさんあります。これは主に各自の興味次第です。視野を広げるために、Python の Web 開発とテスト開発に慣れておくことを個人的にはお勧めします。 自己評価: Web 開発とテスト開発を例に、http サービスを提供する単純なモデルを記述し、対応する自動テストを記述してみます。
Javaは現在、ビッグデータ分野を含むエンタープライズレベルの開発で最も一般的に使用されているソフトウェアであり、最も広く使用されている言語でもあります。たとえば、当時のHadoopエコシステムは基本的にJavaに基づいて開発されました。 Scala は関数型プログラミングの特性により、データ処理に非常に便利な API を提供し、Spark などのプロジェクトの人気により一定の人気を得ています。エンタープライズレベルのソフトウェア開発、高パフォーマンス、大規模データ処理などの点から、JVM 上のこれら 2 つの言語は実用価値が高く、学習する価値があります。 ちなみに、Scala自体は関数型プログラミングの考え方やデザインパターンがかなり多く取り入れられた非常に興味深い言語です。視野を広げ、感性を養うには良い選択です。 アルゴリズム エンジニアの職務特性を考慮すると、Scala の学習ルートは次のようになります。 基本的な構文、開発環境の構成、プロジェクトのコンパイルと操作など、Scalaの基礎知識を学習し習得します。 Coursera の Martin Odersky のコースをお勧めします。また、「Learn Scala Quickly」や「Programming in Scala」という本も参考になります。 自己評価: Scala を使用して、DFS/BFS などのいくつかの簡単なアルゴリズムの問題を実装できるようになります。または、ログファイルの読み取り、重要な情報の抽出など、日常的なデータ作業を Scala を使用して処理します。 Scala を使用して Spark アプリケーションを開発する方法を学ぶには、edX の Big Data Analytics Using Spark または Coursera の Big Data Analytics with Scala and Spark という書籍をお勧めします。また、Fast Big Data Analysis with Spark などの他の関連書籍も参照できます。 自己評価: Spark の Scala API を使用して大規模なデータ分析と処理を実行し、ラグ機能などの特徴エンジニアリング処理を完了できるようになります。 JVM の原理を学びます。Scala/Java はどちらも JVM 上で動作する優れた言語です。その背後には、Web、Android、データ インフラストラクチャなどの幅広いアプリケーションを含む、非常に大規模なエコシステムが存在します。 Python 仮想マシンと比較すると、JVM はより成熟しており、非常に完全な JDK ツール チェーンとさまざまな派生プロジェクトを備えているため、開発者はアプリケーションを簡単にデバッグおよび調整できます。この点に関しては、周志明の「Java 仮想マシンの深い理解」を勉強することをお勧めします。 自己評価: JVM GC の原理を理解し、JDK の関連ツールまたは arthas などの優れたサードパーティ ツールを使用して、Spark データ アプリケーションのリソース使用状況、GC プロファイリング、ホット メソッド プロファイリングなどをトラブルシューティングおよび分析し、パラメータを最適化できるようになります。 コンピュータ言語の理論。プログラミング言語は、コンピュータサイエンスの重要な分野として、型理論、プログラム分析、ジェネリック、メタプログラミング、DSL、コンパイル原則など、詳細な研究に値する多くのトピックが含まれています。この分野の多くのトピックは、機械学習にも多くの実用的な応用があります。たとえば、TVM のような作業には、コンパイラの原理の多くの応用が含まれます。Zhihu の大物「Blue」もこの分野の専門家であり、ディープラーニング フレームワークに関連する作業に従事しています。 llvm と clang の作者である Chris Lattner 氏も Google に入社し、Swift for Tensorflow などの取り組みを主導しました。 Scala は、アカデミックな雰囲気が強い言語です。FP とメタプログラミング機能のサポートが優れており、自動推論、ジェネリック、その他の高度な言語機能を含む強力な型システムを備えています。比較的新しい言語ですが、学ぶ価値が非常に高く、PL の分野を深く学ぶための「入門コース」でもあります :) この側面に興味のある学生は、「Scala 関数型プログラミング」、「Colon Classroom」、Coursera の「プログラミング言語」を読むことを検討できます。これも非常に優れたコースです。さらに、単に科学の一般理解を深めたい学生は、有名な「ハッカーと画家」を読んで、その雰囲気をつかむこともできます。
TensorFlow、PyTorch、LightGBM など、現在人気のアルゴリズム フレームワークはすべて、メイン言語として C++ をベースに実装されています。ただし、C++ 自体は複雑すぎるため、使用シナリオは比較的限られています。基本的な C++ コード ロジックを理解できれば十分であることが推奨されます。システムレベルの開発の分野では、新しい言語が徐々に登場し、StackOverflow によって数年連続でプログラマーのお気に入りの言語に選ばれています。Rust です。設計コンセプトや一部の業界アプリケーション(TiKV など)の観点から見ると、それでも非常に優れていますが、詳細に研究していないため、具体的な推奨事項は示しません。この点に関して推奨される学習コンテンツとしては、古典的な「Cプログラミング言語」とRustの公式: https://github.com/rust-lang/rustlings などがあります。 私たちが作成するアルゴリズム アプリケーションは、オペレーティング システム環境を通じて物理ハードウェア上で実行されます。実際の操作プロセスでは、プログラムがリソース不足のエラーを報告する理由、ノートブックをブラウザで開けない理由、プロセスがハングして応答しない理由など、多くの関連する問題に遭遇します。これらすべてには、問題を理解して分析し、最終的にトラブルシューティングして解決するために、ある程度のオペレーティング システムの知識が必要です。オペレーティング システムは、多くのコンテンツをカバーしています。全体像を把握するために、最初はいくつかの主要な概念 (ハードウェア構造、CPU スケジューリング、プロセス、スレッド、メモリ管理、ファイル システム、IO、ネットワークなど) を理解するだけで十分です。後で実用的な問題に遭遇した場合は、各部分を詳しく学習することができます。優れた学習教材も多数あり、その多くは大ボリュームです。特に「Deep Understanding of Computer Systems」、「Operating Systems: Three Easy Pieces」、「Modern Operating Systems」をお勧めします。 日常業務で最もよく使用される 2 つのオペレーティング システムである CentOS と macOS は、どちらも Unix/Linux システムであるため、関連する基本知識を学習して習得することが非常に重要です。習得しなければならない知識ポイントには、シェルとコマンドライン ツール、ソフトウェア パッケージの管理、ユーザーと権限、システム プロセス管理、ファイル システムの基礎などがあります。この分野で推奨される入門学習教材は「Bird Brother の Linux プライベート レシピ」です。これは基本的に、Linux システム管理者が習得する必要のある知識のあらゆる側面を網羅しています。より高度な読み物として、「Advanced Programming in Unix Environment」を読むと、さまざまなシステム コールについて非常に詳細に説明されており、パフォーマンス チューニングなどのその後の高度なアプリケーションの基礎を築くことができます。 トラブルシューティング、パフォーマンス分析と最適化、システムの運用と保守、安定性エンジニアリングには、コンピュータ システムとオペレーティング システムに関する詳細な知識が必要です。興味のある学生は、的を絞って詳細な学習を行うことができます。パフォーマンス最適化を例にとると、古典的な「ピークパフォーマンス」を学習して、その原理と高度なツールチェーンを理解することができます。システム コール トレース (strace)、動的トレース (systemtap、DTrace、perf、eBPF) などのテクノロジは、オペレーティング システム関連の問題のトラブルシューティングに非常に役立ちます。 とりあえず、これをソフトウェア エンジニアリング モジュールの下に配置します。ここで言及されているアルゴリズムは、再帰、ソート、検索、動的プログラミングなどのコンピュータサイエンスにおける古典的なアルゴリズムであり、よく話題になる機械学習アルゴリズムとは異なります。このトピックに関する学習教材はインターネット上にたくさんあります。私はプリンストン大学のアルゴリズム コース (Java の基礎知識が必要) から始め、その後スタンフォード大学のアルゴリズム分析および設計コースを受講して視野を広げました。本に関しては、初心者には「Illustrated Algorithms」から始めて、次に Jeff Erickson の「Algorithms」を読むことを検討するか、上記のオンライン コースを選択することをお勧めします。多くの問題に対する巧妙な解決策が記載されている「Programming Pearls」や「The Beauty of Programming」などの書籍を参照することもできます。本から学ぶだけでなく、LeetCode などの Web サイトに直接アクセスして練習し、スキルを向上させることもできます。 初級プログラマーと中級から上級のプログラマーの最大の違いの 1 つは、コード作成の習慣です。コンピューターが理解して正常に実行できるコードの作成から始め、徐々に人間が理解でき、変更や保守が容易なコードの作成へと進化します。この学習パスでは、まずこの領域での認識を構築し、次に実戦で自分のコードを繰り返し考え、磨き上げ、他の優れたプロジェクトのコードから判断して学び、徐々に改善していく必要があります。推奨される学習書には、非常に短く簡潔な入門書である「The Art of Writing Readable Code」があります。その後、「Clean Code」、「Code Complete」、「The Pragmatic Programmer」などの古典的な大著をゆっくりと読むことができます。この点に関しては、Python にはより的を絞った「Effective Python」という本もあり、読む価値があります。 コード アーキテクチャの観点では、デザイン パターンは重要なトピックであり、日常業務で発生する多くの典型的なシナリオに対していくつかのソリューションが提供されています。この分野で最も有名な本は GoF の「デザインパターン」ですが、個人的にはあまりお勧めしません。特に Python をメインの作業言語として使用する場合、そこに含まれるデザインパターンのほとんどは必要ないかもしれません。まず、この Web サイトを参照して基本的な概念を習得してください: https://refactoringguru.cn/design-patterns/python。その後、「クリーン アーキテクチャ」、「リファクタリング」、およびその他の関連データを読んで、コード アーキテクチャを最適化するプロセスにおける考え方の核心を理解し、それを適用することを検討してください。 Python 関連のデザインパターンの応用については、「Python in Practice」も参照できます。 実際にオンラインで運用する必要があるソフトウェア プロジェクトの場合、品質保証は、製品全体が期待どおりに動作することを保証できる非常に重要なリンクです。機械学習プロジェクトでは、データの導入により、従来のソフトウェアテストよりも難しくなり、業界がまだ模索している方向でもあります。まず「The Art of Unit Testing」または「The Google Way of Software Testing」を読んで、ソフトウェアテストの基本的な概念と操作方法を大まかに理解することをお勧めします。これを基に、機械学習の分野でMartin Fowlerが提案したCD4MLの関連テストリンクをさらに読み、sklearnやLightGBMなどのオープンソースライブラリのテスト開発方法を学習し、機械学習に関連する品質保証の技術的能力を習得することができます。 ソフトウェア エンジニアリングの進歩のプロセスでは、プロジェクト管理関連のスキル、方法、ツールの適用も非常に重要です。その中で、アジャイル開発、設計レビュー、コードレビュー、バージョン管理、タスクボード管理など、さまざまな研究開発プロセスと仕様は、実際のプロジェクト推進において非常に重要な知識とスキルです。この点では、ソフトウェア プロジェクト管理のあらゆる側面を理解するために、古典的なソフトウェア エンジニアリングの教科書「The Art of Build」を学習することをお勧めします。さらに、広い意味でのプロジェクト管理における多くの知識ポイントは、その後の深い学習の方向でもあります。Geek Time の「プロジェクト管理実践に関する 20 の講義」コースを参照できます。 ソフトウェア エンジニアがスキルを伸ばす方法の 1 つは、ソフトウェア アーキテクトになることです。この方向では、スキルに対する総合的な要件が非常に高く、テクノロジの選択とシステム アーキテクチャ設計、アーキテクチャ設計の原則とパターン、幅広い R&D 知識の範囲、高パフォーマンス、高可用性、スケーラビリティ、セキュリティなど、詳細な学習と理解を必要とする高度なトピックも多数あります。興味のある学生は、Geek Time の「Learn Architecture from Scratch」コースを受講し、この分野でのビジョンと能力を徐々に伸ばすことができます。また、「マイクロサービスアーキテクチャ設計パターン」やドメイン駆動設計に関する一連の書籍なども参考にして勉強する価値があります。 アルゴリズム モデリングを実行する際には、データを深く理解し、さまざまな探索的分析、統計モデリングなどを実行することが非常に重要です。これには、確率論、統計などの基本的な数学的知識が必要です。古典的な数学の教科書に加えて、「統計的思考」、「ベイズ法」、「プログラマのための数学 2」など、よりプログラマ向けの本を参照することもできます。 データ分析を行う際、視覚化はデータの状況を素早く把握し、データパターンを発見し、異常を特定するのに役立つ非常に重要な手段です。データの種類によって、さまざまなグラフの種類、ボードのデザイン、分析のアイデア、人間とコンピューターの相互作用の方法など、さまざまな視覚化のベスト プラクティスが対応します。一方、視覚化とデータレポートは、さまざまな役割やグループの人々とデータの洞察を伝達するための重要な手段でもあります。ビジネスの観点から視覚化とコミュニケーションの方法を考える必要があります。この点では、「データによるストーリーテリング」や「定量情報の視覚的表示」などの古典的なデータを参考にすることができます。同時に、自分のビジネスの背景感覚を養い、コミュニケーションスキルを向上させることも必要です。 アルゴリズム モデルを最適化する際には、データ分析に基づいて実験の方向を決定する必要があります。これにはいくつかの利点があります。 機能を追加したりパラメータを変更したりする際に経験に頼るのではなく、分析に基づいてチューニングをガイドする方が方向性が明確になります。たとえ企業側から提供された情報であっても、既成事実として扱うのではなく、データ分析に基づいた取り組みを行うのがよいでしょう。 分析を通じて発見された根本原因は、結果の検証にも役立ちます。特に予測対象となるデータの量が非常に多い場合、単一の特徴量を追加しても全体の精度は数千分の一程度しか向上しない可能性が高く、それが自然な変動なのか、実際の改善なのかを判断することは不可能です。ただし、分析の前提条件がある場合は、全体的な精度だけでなく、この既知の問題に対してチューニング戦略が有効かどうかを具体的に調べることができます。 また、徹底的なトラブルシューティングや問題解決にも役立ちます。結果が改善されない場合、機能が役に立たないのではなく、機能コードにバグがある可能性もあります。データ分析の目標としては、なぜこの特徴量が効果がないのか、モデルが学習していないのか、特徴量が判別できないのかなど、改善策があるかどうかがわかります。これにより、チューニングの試みが成功したかどうかを判断する理由をより徹底的に調査するのにも役立ちます。 データ分析により、売上データのクリーニング処理に問題があるかどうか、業務自体に異常があるかどうか、データを削除する必要があるかどうかなど、追加の問題点を発見するのに役立ちます。
業界にはエラー分析に関する探索的研究がいくつかありますが、そのほとんどは「オープンワールドにおける未知の未知数の特定」や「予測エラーの特性評価」などの分類問題に基づいています。これらの研究を理解し、具体的なビジネス状況と組み合わせることで、エラー分析の考え方と方法論を深く考え、まとめることができます。 誰もがこれに精通しているはずです。入門レベルの学習ルートについては、機械学習の基礎、一般的に使用される機械学習の方法、学習理論、強化学習などのいくつかの高度なトピックをカバーしている周志華教授の「機械学習」を参照できます。理論的基礎を深めたい場合は、「PRML」、「ESL」、「統計的学習法」などの古典を参考にしてください。実際の戦闘では、ビジネス知識、アルゴリズムの原理、データ分析を統合して、モデリングとチューニングの方法論を徐々に蓄積し、全体的な実験反復の効率と成功率を向上させる必要があります。 近年登場したディープラーニングは、機械学習の分野で非常に重要な分野となり、さまざまな応用分野で大きな役割を果たしてきました。従来の機械学習と比較して、特徴エンジニアリングの要件が軽減されることが主な利点となっています。一方、ディープラーニングは、大量のデータや大規模な計算能力に対する強力な応用能力を備えており、全体的な出力効果も一定程度向上しています。理論研究がやや遅れているため、ディープラーニングは実際のアプリケーションにおいてユーザーの経験とスキルに対する要件が比較的高く、比較的理想的な結果を達成するには多くの実践経験が必要です。この分野のおすすめ教材としては、Kerasの作者による「Deep Learning with Python」や「Hands-on Machine Learning with Scikit-Learn and TensorFlow」などが挙げられます。理論面では有名な「花の本」の「Deep Learning」がおすすめです。学習した理論的原則に基づいて、実際のアルゴリズムの適用におけるさまざまな指標とデータ分析を観察して、モデルを強化するための運用上の改善点を見つけることに特別な注意を払う必要があります。 現在、当社の事業領域には時系列予測、自然言語処理、レコメンデーションなどがあり、画像、検索、広告などの他の分野でも独自のドメインモデリング手法を持っています。時系列分野では、ARIMA、Prophetなどの従来の時系列モデル、LightGBMと組み合わせたスライディングウィンドウ特徴構築法などの機械学習モデル、LSTM、seq2seq、Transformerなどのディープラーニングモデルが含まれます。この点については、Kaggle の関連コンペで共有されているソリューションや、Amazon、Uber、Tmall など、同様のビジネス シナリオを持つ企業の共有資料を参照できます。他の分野でも同様です。技術の歴史的進化、関連する競争、業界のソリューション共有とオープンソースプロジェクト、会議論文を理解することで、学習モデリング手法を徐々に習得し、実際のビジネスと組み合わせて実践的な試みを行い、より体系的な個人の知識とスキルを蓄積することができます。 プロジェクトの実施中には、さまざまな複雑なデータ処理操作が必要になるため、そのようなフレームワークを習得することが特に重要です。現在、業界標準は基本的にPandas DataFrameの定義を参照しています。データ量が多い場合は、Spark、Dask、Modin、Marsなどの分散操作をサポートするDataFrameや、cuDF、Vaexなどの改良された実装など、単一マシンのパフォーマンスを向上させる類似のフレームワークも多数あります。このテーマに関する古典的な書籍としては、Wes McKinney の「Python for Data Analysis」が挙げられます。基本的なデータ操作を習得した後は、ウィンドウ関数やベクトル化されたパフォーマンスの最適化などの高度なトピックについて学習できます。さらに、SQL は非常に複雑なデータ処理タスクも実行できます。Alibaba などの多くの企業は、データ処理プロセスを構築するための主な方法として SQL を使用しています。興味のある学生は、SQL でのさまざまな高度な計算の使用方法と最適化方法についても学ぶことができます。 機械学習用の新しいフレームワークが次々と登場しています。一方では、古典的なフレームワークの使い方をマスターし、そのモジュール構成やインターフェース仕様の設計を理解する必要があります。また、他の新しいフレームワークも、ある程度、これらの業界標準フレームワークのモジュールとインターフェースの定義に従う必要があります。一方、新しいフレームワークや特定分野のフレームワークの場合は、迅速に評価し、開始し、一定の変更や適応を行う能力を習得する必要があります。古典的なフレームワークには次のようなものがあります。 一般的な機械学習: scikit-learn、Spark ML、LightGBM 一般的なディープラーニング: Keras/TensorFlow、PyTorch 機能エンジニアリング: tsfresh、Featuretools、Feast AutoML: ハイパーオプト、SMAC3、nni、オートグルーオン 説明可能な機械学習: shap、aix360、eli5、interpret 異常検出: pyod、eGads 視覚化: pyecharts、seaborn データ品質: cerberus、pandas_profiling、Deequ 時系列: fbprophet、sktime、pyts 大規模機械学習: Horovod、BigDL、mmlspark パイプライン: MLflow、metaflow、KubeFlow、Hopsworks
一般的な学習方法は、これらのフレームワークの公式ドキュメントとチュートリアルを読んで、自分のプロジェクトで使用してみることです。一部のコア インターフェースについては、関連するソース コードを読んで、その背後にある原理を深く理解することもできます。 アルゴリズムエンジニアの日常業務に多少関連する他の一般的なフレームワークとしては、Web フレームワーク、クローラー フレームワークなどがあります。最も代表的なものは Flask と scrapy です。これら 2 つの分野にはそれぞれ独自の巨大な領域があり、特に Web 開発が顕著です。興味のある学生は、データ検証、シリアル化、自動ドキュメント化、非同期の高パフォーマンスなど、多くの最新フレームワークの設計アイデアを借用した FastAPI などの新しい Python 3 ベースのフレームワークについても学習し、知識を広げることができます。 多くのプロジェクトでは、データの量が 10 億を超えると、単一マシンでのトレーニングをサポートすることが難しくなります。そのため、分散トレーニングは実際のエンジニアリング実装においても非常に重要なトピックとなります。分散トレーニングには、複数のマシン間の通信と調整、最適化アルゴリズムの変換、データとモデルの集約、およびフレームワークの選択と操作とメンテナンスなどのトピックが含まれます。さらに、分散システムの場合、傑作「データ集約型アプリケーションシステムの設計」を参照して、それらの背後にある原則を理解することもできます。 近年、大規模なデータトレーニングや推論を行うと、多くの高性能コンピューティング最適化方法が現れています。この点で、基本的な並列プログラミング、コンピレーションの原則、最適化の知識から、CUDA、OpenMP(NvidiaのCudnn、LightGBMもOpenMPを使用しています)、Codegen、JIT、およびその他の技術をSpark、TVM、およびその他のプロジェクトを実施することが推奨されることが推奨されることが推奨されます。 この方向は、大きなバッチサイズ、継続的なオンライン/増分学習、その他の手段を使用するなど、2つの部分に分割されます。この点で、業界には、1時間の古典的な「トレーニングイメージネット」、MobileNet、Tensort、バイナリネットワークなど、さまざまな記事や技術的な実装があります。 データパイプライン、トレーニングパイプライン、パイプラインの提供など、さまざまなパイプラインのオーケストレーションとスケジューリング機能のサポートが含まれています。この点で一般的に使用されるフレームワークツールには、エアフロー、イルカシェドラー、ケイデンスなどが含まれます。基本的な作業原則と使用方法を習得し、オフラインの実験とオンライン操作に適用できる必要があります。 従来のDevOpsと比較して、機械学習プロジェクトの最大の違いは、データへの依存がより重要かつ重要になることです。この分野のトピックには、データの系統、データ品質保証、データバージョン制御などが含まれます。データバージョン管理、TFXデータ検証、Cerberus、Deequなど、データ品質のためのDVCなど、参照に使用できるさまざまなツールがあります。方法論レベルでは、「MLテストスコア」は、言及して学習する価値のある多くの特定のデータ関連テスト方法を提供します。 この部分は、MLプロジェクトの独自性でもあります。開発プロセス中に、その後の調整と最適化の方向を導き、オンライン展開の最良の結果を選択するために、多くの実験と対応する出力結果があります。この点で参照として使用できるプロジェクトには、MLFLOW、FITLOG、WANDBなどが含まれます。もちろん、単一のプロジェクトでは、オンラインExcelはニーズを満たすのに十分かもしれません:) 現在、私たちのサービングのほとんどはオフラインバッチの事前計算の形式であるため、主な技術的手段は、モデル予測インターフェイスを直接使用するなど、MMLSparkおよびその他のツールを使用して大規模な並列推論などを使用するなど、さまざまなオフライン推論方法です。オンラインサービングが関与している場合、オンラインパイプラインの実行、リアルタイム機能の取得、低レイテンシ/高スループットサービスサービスなど、状況はより複雑になります。TFサービング、MLEAP、H2O、PREDCTIONIO、PMML/PFA/ONNXおよびその他の開発標準モデル形式を参照できます。 ソフトウェアエンジニアリングにおける継続的な統合と継続的な展開は、標準的な慣行となっています。この方向では、いくつかの主要なトピックには、自動テスト、パイプラインパッケージングと展開、継続的な監視と操作などが含まれます。CD4MLに関するMartin Fowlerの記事を参照できます。ツールシステムレベルでは、従来のジェンキンスを学ぶことができます。また、Circleci、GOCD、VERCD(Uber)などの新しいオプションもあります。 プロジェクト全体が開始された後、システムの各リンクを監視し、さまざまな異常な状況に応答する必要があります。たとえば、テストデータとトレーニングデータの間に分布シフトがあるかどうかを判断して、操作障害の監視があるかどうかを判断します。情報収集の監視に加えて、一連の自動アラーム通知、ログトラッキング、および調査も必要です。この分野のツールフレームワークには、アルゴリズムプロジェクト向けに特別に設計されたTFデータ検証などの新製品、およびElasicsearch + Kibanaなどの従来の製品が含まれます。 MLOPS全体は比較的大きなトピックであり、この点で参照と学習として使用できる多くの製品およびシステム設計の実践があります。たとえば、Uberのミケランジェロシリーズの一連の記事、Facebookのfblearner、neptune.ai、dataiku、dominoなど。オープンソースではありませんが、デザインの概念、進化的思考、白い論文などの多くは学ぶ価値があります。 MLFLOW、Kubeflow、Metaflow、TFXなど、オープンソースの世界で参照として使用できる多くのプロジェクトもあります。デザインの概念、ロードマップ、実装の詳細を学ぶことができます。 私たちの毎日の仕事では、データベースの使用が必要な多数のシナリオがあります。顧客データのドッキング、データセットの管理と使用、データテーブルの設計とさまざまなビジネスシステムの最適化まで、データベースの操作原則、適用可能なシナリオ、運用とメンテナンスの使用、パフォーマンスの最適化などを特定する必要があります。習得する必要がある一般的な概念には、OLTP対OLAP、トランザクション、インデックス、分離レベル、酸とキャップの理論、データの同期、データシェルディング、SQL構文、ORMなどが含まれます。基礎となる原則から、データ、インデックス、ログなどのストレージエンジン、および分散システムの設計と実装など、さまざまなコンピューティングおよびクエリエンジンが含まれます。この点で推奨される学習資料には、「データベースシステムのインサイダー」および「データ集約型アプリケーションシステムの設計」が含まれます。 現在、一般的に使用されるリレーショナルデータベースは、主にMySQLとPostgreSQLです。これに基づいて、データ型、高度なコンピューティング、ストレージエンジン、展開と操作とメンテナンス、パラダイムの概念、テーブル構造設計などのいくつかのトピックをさらに理解できます。高度なトピックには、「高性能MySQL」および「高可用性MySQL」をお勧めします。 一般的に使用されるNOSQLデータベースがいくつかあります:KVストレージ(REDIS)、ドキュメントデータベース(MongoDB)、ワイドコラムストレージ(Cassandra、HBase)、グラフデータベース(NEO4J)。現在のアルゴリズムプロジェクトでは、redisのようなKVストレージ(または一般的なKVSとして使用される場合があります)、またはデルタ湖のような最近のストレージシステム。このタイプのKVストレージ、分散データベースの一般的な動作方法、基本的な運用およびメンテナンス検査、およびパフォーマンス最適化方法について学ぶことをお勧めします。 ITシステムの全体的な開発動向は、クラウドコンピューティングに向けて進化しています。アプリケーション開発者の場合、さまざまな仮想化やコンテナテクノロジー、構成管理、コンテナオーケストレーションなど、いくつかのインフラストラクチャの知識を理解する必要があります。ツールレベルから、DockerやK8Sなどのテクノロジーは急速に発展しており、主に公式文書に基づいて学習しています。 Zhijiang Universityが発行した本「Docker -Container and Container Cloud」のトピックに関する詳細な議論がいくつかあります。また、「Kubernetes in Action」で読む価値もあります。方法論的な観点から、「コードとしてのインフラストラクチャ」と「サイトの再発性エンジニアリング」は、2つの非常に優れた学習資料です。仮想化、操作とメンテナンス、継続的な統合など。アルゴリズムアプリケーションと組み合わせて、比較的新しい領域であり、実行可能なルートを探索する必要があります。 過去数年間で最も人気のある分散型ストレージは、Googleの古典的なGFSペーパーに由来しています。したがって、S3、Minioなどの単純なオブジェクトストアの形で分散ストレージを学習することをお勧めします。デルタ湖など、これに基づいた一部のストレージシステムは、トランザクション、効率的なアップサート、タイムトラベル、その他の機能を提供します。原則の観点から、「データ集約型アプリケーションデザイン」という本を引き続きお勧めします。 ビッグデータ時代の分散コンピューティングの創始者は、Googleの古典的なMapReduce Paperから来ています。これは、過去数年間で非常に人気のあるテクノロジーであったHadoop Systemにその後実装されました。現在、業界の主流はSparkとFlinkです。現在、Sparkは一般的に使用されているコンピューティングエンジンです。その後の主な困難には、大量のデータ量での問題調査とパフォーマンスの調整、複雑な計算の実行、またはPython関連のUDFとの相互作用などがあります。この点で、Master、Worker、Driver、Executorなどの関係、怠zyな評価、Dagの系統と舞台の概念、シャッフル最適化、全体的なコードゲン、その他の技術的な詳細など、Sparkのシステムアーキテクチャと内部原則を特定の理解を深める必要があります。当面の間、この点で良い情報は見つかりませんでした。主に、実際の問題を解決する経験の蓄積に依存しています。 その他のクラウドサービスインフラストラクチャには、分散データベース、メッセージキュー、ZK/RAFT分散コラボレーションシステム、仮想ネットワーク、ロードバランシングなども含まれます。これらのトピックは、アルゴリズムの適用からは遠く離れています。 自動化された機械学習のより伝統的な部分は、ハイパーパラメーターの最適化です。これは、データの前処理、機能エンジニアリング、機能選択、モデル選択、モデルチューニング、郵便処理、その他の部品など、パイプライン全体のハイパーパラメーターの最適化に一般化できます。現在、業界で広く使用されている技術的手段は、主にランダム検索、ベイジアンの最適化、進化的アルゴリズム、ハイパーバンド/BoHBなどです。機能エンジニアリングの観点から、featureTools、tsfresh、オートクロスなどの自動機能エンジニアリングツールがあります。学術コミュニティでは、マルチフィデリティの最適化、マルチタスク最適化、HPOとアンサンブル学習、パイプライン計画、データ差別的データ分布検出などを含む、さらに調査と研究があります。学習については、http://automl.orgのさまざまな参考資料や本を参照できます。主な難しさには、Automlアルゴリズムの一般化能力、スケーラビリティ、全体的なパイプラインの組み合わせの検索と生成、さまざまな学習アルゴリズムの自動最適化方法などが含まれます。 メタ学習は、近年非常に活発になっている新興分野です。その主なアイデアは、メタ学習モデル方法をモデル化と調整を蓄積し、タスク全体のモデル効果を推測し、新しいトレーニングタスクを開始することです。この点で業界の主なアプリケーションは、基本的に、新しいタスクでのハイパーパラメーター最適化の開始検索ポイントをガイドするために使用される一連のパブリックデータセット検索を通じて、優れたパフォーマンス開始パラメーターを見つけるなど、モデリングとチューニングの優先順位の蓄積に焦点を当てています。構成スペースに関する研究に加えて、学術研究には、学習曲線、メタフィーチャー抽出とモデリングからの学習推論、パイプライン構築におけるHTN計画の適用、およびMAMLなどの少数の学習方向の探求も含まれます。この点で、Lilian Wengの一連の記事(https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html)とhttp://automl.org Webサイトの情報を推奨します。 Automlの分野は非常に人気がありますが、現在、この分野での調査と試みを行うには、大量のコンピューティングリソースが必要です。 自動化された機械学習に関連する多くのフレームワークツールもあります。これらのツールフレームワークを学習することにより、Automlシステムのアーキテクチャと実装を理解し、実際のプロジェクトに適用できます。 3つの主な側面があります。1つは、線形回帰、意思決定ツリーなど、単純なものです。 EBM、ニューラルネットワーク、ベイジアンルールリスト、スリムなどの他の複雑なモデルも、独自の特性の一部を使用して、GradCamメソッドなどの説明を提供することもできます。 2つ目は、PDP、ICEなどの古典的な機能マップ、LIMEなどのサロゲートモデルメソッド、ゲーム理論に基づくShapleyメソッドなど、モデルに依存しない解釈方法です。 3番目は、連絡先の説明、敵対例、プロトタイプ、影響力のあるインスタンス、KNNなどのサンプルに基づく説明方法ですが、このタイプの方法では一般に大きな計算オーバーヘッドがあり、プロジェクトで実装するのは簡単ではないようです。この情報については、解釈可能な機械学習と説明可能なAIを学ぶことができます(ディープラーニングの詳細)。さらに、モデル解釈、自動時系列分析とレポート生成、因果モデル、モデルの公平性と社会的影響などの次元削減作業など、学術コミュニティには多くの最先端の調査があります。 ツールフレームワークに関しては、Microsoftの解釈、ELI5、SHAP、AIX360など、使用できる多くのオープンソースプロジェクトがあります。さらに、マニホールドとテンソルボード、モデルデバッグツール、自動エラー分析とモデル改善ソリューション、因果モデルフレームワーク、モデルの公平性評価と修正ツールなど、マニホールドとテンソルボード、モデルデバッグツール、モデルのデバッグツール、モデルの改善ソリューションなど、非伝統的な意味でいくつかのモデル説明があります。これらはすべて、一般化されたモデル解釈の分野でカバーできます。ツールに基づいて、ビジネス分野の知識を組み合わせてよりターゲットを絞った説明ソリューションを提供する方法は、考える価値のある方向でもあります。 現在、機械学習アプリケーションの分野は、上記のスキルの方向に加えて、依然として急速に発展し、進化しています。以前のプログラミング、ソフトウェアエンジニアリング、および機械学習の習得に基づいて、研究の方向性の後半では、詳細な調査と実践のために個人的な関心に基づいていくつかを選択できます。関連する本や記事を読むことによってのみ、知識のコンテンツを予備的に理解することができます。 著者について Zhou Yuan(ニックネーム:BYTE)、Guanyuan Dataの共同設立者兼チーフデータサイエンティスト。私たちは、パンリテール消費の分野における最先端のアルゴリズム技術の適用に取り組んでおり、世界のトップ500の顧客である業界での複数のAIプロジェクトのアプリケーションをリードし、発売することに深く参加しています。彼はかつてMicroStrategyで働いていましたが、Alibaba Cloudはビジネスインテリジェンス製品とクラウドコンピューティングシステムの研究開発に従事しており、10年以上の業界経験があります。現在の研究対象には、主に解釈可能な機械学習、Automl、および大規模な機械学習システムの方向性が含まれます。 |