そもそも、なぜ機械学習にGoを検討するのですか?
Pythonはプロトタイピングと研究に最適な言語ですが、限界があります。
生産性: Pythonは、特に最適化されたライブラリがないと遅い
並列処理:GIL(グローバルインタプリターロック)はマルチスレッドを複雑にする
展開:依存関係のあるPythonアプリケーションのパッケージ化は、さらに難しいタスクです
標準化:動的型付けは、本番環境でエラーにつながる可能性があります
Goはこれらの問題の多くを解決します。
高性能なコンパイル言語
Goroutine を介した競合性のサポートを組み込み
依存関係のない単一のバイナリファイル
静的型付け
GoでMLの分野で何ができますか?
1. 推論(既製モデルの適用)
最も一般的なシナリオは、すでにトレーニングされたモデルを使用することです。Pythonでモデルをトレーニングし、Goのプロダクションで使用します。
ONNXランタイムの例:
package main
import (
"fmt"
onnxruntime "github.com/yalue/onnxruntime_go"
)
func main() {
// PyTorch/TensorFlowでトレーニングされたモデルを読み込みます
session, err := onnxruntime.NewSession[float32](
"model.onnx",
[]string{"input"},
[]string{"output"},
nil,
)
if err != nil {
panic(err)
}
defer session.Destroy()
// 入力データを準備しています
input := []float32{1.0, 2.0, 3.0, 4.0}
// 予測を立てる
output, err := session.Run([][]float32{input})
if err != nil {
panic(err)
}
fmt.Println("Prediction:", output[0])
}2. 古典的な ML アルゴリズム
多くのタスクではニューラルネットワークは必要ありません。線形回帰、決定木、k平均などはすべてGoで実装できます。
GoLearnライブラリ:
package main
import (
"fmt"
"github.com/sjwhitworth/golearn/base"
"github.com/sjwhitworth/golearn/evaluation"
"github.com/sjwhitworth/golearn/knn"
)
func main() {
// データを読み込んでいます
rawData, err := base.ParseCSVToInstances("data.csv", true)
if err != nil {
panic(err)
}
// KNN分類子を作成する
cls := knn.NewKnnClassifier("euclidean", "linear", 2)
// トレーニングとテストに分割します
trainData, testData := base.InstancesTrainTestSplit(rawData, 0.7)
// 学習
cls.Fit(trainData)
// 精度を確認しています
predictions, err := cls.Predict(testData)
if err != nil {
panic(err)
}
confusionMat, err := evaluation.GetConfusionMatrix(testData, predictions)
if err != nil {
panic(err)
}
fmt.Println(evaluation.GetAccuracy(confusionMat))
}3. データ処理と特徴エンジニアリング
Goは、ETLパイプラインや大量のデータ処理に最適です。
package main
import (
"encoding/csv"
"os"
"strconv"
"sync"
)
type DataPoint struct {
Feature1 float64
Feature2 float64
Label int
}
func processData(filename string) ([]DataPoint, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
reader := csv.NewReader(file)
records, err := reader.ReadAll()
if err != nil {
return nil, err
}
// ハードウェアを介した並列処理
var wg sync.WaitGroup
results := make([]DataPoint, len(records)-1)
for i, record := range records[1:] {
wg.Add(1)
go func(idx int, rec []string) {
defer wg.Done()
f1, _ := strconv.ParseFloat(rec[0], 64)
f2, _ := strconv.ParseFloat(rec[1], 64)
label, _ := strconv.Atoi(rec[2])
// 正規化またはその他の変換
results[idx] = DataPoint{
Feature1: (f1 - 50) / 10,
Feature2: (f2 - 100) / 20,
Label: label,
}
}(i, record)
}
wg.Wait()
return results, nil
}4. ML のマイクロサービス
Goは、MLモデルに対応するAPIを作成するのに最適です。
package main
import (
"encoding/json"
"net/http"
"log"
)
type PredictionRequest struct {
Features []float64 `json:"features"`
}
type PredictionResponse struct {
Prediction float64 `json:"prediction"`
Confidence float64 `json:"confidence"`
}
func predictHandler(w http.ResponseWriter, r *http.Request) {
var req PredictionRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// ここであなたのモデルを呼び出します
prediction := runModel(req.Features)
response := PredictionResponse{
Prediction: prediction,
Confidence: 0.95,
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(response)
}
func runModel(features []float64) float64 {
// あなたの論理的な推論
return 42.0
}
func main() {
http.HandleFunc("/predict", predictHandler)
log.Println("Server starting on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
MLの人気Goライブラリ
Gorgonia — PyTorch に似たニューラル ネットワークを構築するためのライブラリ
GoLearn — 古典的なMLアルゴリズム
Gonum — 数値計算(NumPyのアナログ)
ONNX Runtime Go — ONNX モデルの起動
TensorFlow Go — TensorFlowのGoバインディング
GoとPythonはいつ使うべきですか?
次の場合に Go を使用します。
生産性の高い生産が必要です
展開の容易さが重要です(1つのバイナリ)
競合の負荷に対応
既製のモデルを使用する(推論)
MLマイクロサービスを構築する
次の場合は Python を使用してください。
研究と実験を行う
複雑なニューラルネットワークをトレーニングする
豊富なライブラリの選択肢が必要です
データサイエンティストのチームとの連携
最も実用的な選択肢:
Python モデルのトレーニング、実験、データサイエンス
Go 本番環境、API、データ処理用
このアプローチは、各言語の強みを活用します。
実例:推奨システム。
package main
import (
"math"
"sort"
)
type Item struct {
ID int
Features []float64
}
type Recommendation struct {
ItemID int
Score float64
}
// コシヌス類似性func cosineSimilarity(a, b []float64) float64 {
var dotProduct, normA, normB float64
for i := range a {
dotProduct += a[i] * b[i]
normA += a[i] * a[i]
normB += b[i] * b[i]
}
return dotProduct / (math.Sqrt(normA) * math.Sqrt(normB))
}
// 推奨事項を取得するfunc getRecommendations(userPrefs []float64, items []Item, topN int) []Recommendation {
recommendations := make([]Recommendation, len(items))
for i, item := range items {
recommendations[i] = Recommendation{
ItemID: item.ID,
Score: cosineSimilarity(userPrefs, item.Features),
}
}
// スコアで並べ替え
sort.Slice(recommendations, func(i, j int) bool {
return recommendations[i].Score > recommendations[j].Score
})
return recommendations[:topN]
}
func main() {
userPrefs := []float64{0.8, 0.3, 0.9}
items := []Item{
{ID: 1, Features: []float64{0.9, 0.2, 0.8}},
{ID: 2, Features: []float64{0.1, 0.9, 0.2}},
{ID: 3, Features: []float64{0.7, 0.4, 0.9}},
}
recs := getRecommendations(userPrefs, items, 2)
// 上位2つの推奨事項を表示します
}結論
Goは、特に本番環境で、機械学習システムを構築するために十分に使用できます。はい、Pythonは複雑なモデルのトレーニングの標準であり続けますが、推論、データ処理、および高性能サービスの作成にはGoが最適です。
ツールの選択は常にタスクによって異なります。Python を完全に放棄する必要はありませんが、機械学習の分野での Go の機能を無視する必要もありません。
これらの内容は、 コディケ ― すべてを詳細に分析し、実際のタスクを実践して理解を深めます。当社では、Python、Go、JavaScriptなどの言語の構造化されたコースを実用的なアプリケーションに焦点を当てて提供しています。
サポートが必要で、同じ考えを持つ人とコードについて話し合いたい場合は、すでに 2000人以上のアクティブな開発者 へ Telegramチャンネル、プログラミングを学ぶ過程で、いつでも助け、助言し、サポートしてくれます!
🚀開発者コミュニティに参加する コディケ!
