6.実際のTensorによるネットワーク
PythonとPyTorchを使えば、ニューラルネットは数行で定義できる。
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleNet(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(3, 4) # 入力3 → 隠れ層4
self.fc2 = nn.Linear(4, 2) # 隠れ層4 → 出力2
def forward(self, x):
y1 = F.relu(self.fc1(x))
y2 = self.fc2(y1)
return y2
x = torch.tensor([2.0, 3.0, 5.0])
net = SimpleNet()
print(net(x))
入力がTensorで渡され、各層の重みもTensorとして管理され、演算結果もTensorで返ってくる。
これが「数字の塊で表された知能」の実態だ。
7.業務レベルのTensor活用
実務では「ただ動く」だけでは足りない。
効率と安定性のために、自動混合精度(AMP)、勾配クリッピング、学習率スケジューラ、早期終了、ベストモデル保存などを組み合わせる。
たとえばPyTorchでは以下のような流れが定番になりつつある。
- AMPで高速かつ省メモリ化
- AdamW最適化とCosineスケジューラで安定学習
- 残差接続やLayerNormで深いモデルも崩壊を防ぐ
- 勾配クリッピングで発散を防止
- チェックポイント保存と早期終了で実務に耐えうる運用
これらを組み込んだ実装は、研究段階からすぐに現場投入できる。
Pythonの世界では、もはや「Tensorを扱えるかどうか」が実務スキルの分水嶺になっている。
import os
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader, TensorDataset
from torch.cuda.amp import autocast, GradScaler
# ======================================
# 0. 環境設定
# ======================================
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
torch.manual_seed(42)
# ======================================
# 1. ダミーデータ(実務では差し替え)
# ======================================
X = torch.randn(10000, 128) # 特徴量 128次元
y = torch.randint(0, 10, (10000,)) # クラス数 10
train_ds = TensorDataset(X[:8000], y[:8000])
val_ds = TensorDataset(X[8000:], y[8000:])
train_loader = DataLoader(train_ds, batch_size=256, shuffle=True)
val_loader = DataLoader(val_ds, batch_size=256)
# ======================================
# 2. モデル定義
# ======================================
class MLP(nn.Module):
def __init__(self, in_dim=128, hidden=256, out_dim=10):
super().__init__()
self.fc1 = nn.Linear(in_dim, hidden)
self.fc2 = nn.Linear(hidden, hidden)
self.fc3 = nn.Linear(hidden, out_dim)
self.dropout = nn.Dropout(0.2)
self.norm = nn.LayerNorm(hidden)
def forward(self, x):
x = F.relu(self.fc1(x))
x = self.dropout(self.norm(F.relu(self.fc2(x))))
return self.fc3(x)
model = MLP().to(device)
# ======================================
# 3. 最適化・スケジューラ
# ======================================
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=1e-4)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10)
scaler = GradScaler()
# ======================================
# 4. 訓練ループ
# ======================================
best_val_loss = float("inf")
for epoch in range(1, 51):
model.train()
train_loss = 0
for xb, yb in train_loader:
xb, yb = xb.to(device), yb.to(device)
optimizer.zero_grad()
with autocast(): # AMP
preds = model(xb)
loss = F.cross_entropy(preds, yb)
scaler.scale(loss).backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
scaler.step(optimizer)
scaler.update()
train_loss += loss.item()
scheduler.step()
# 検証
model.eval()
val_loss, correct = 0, 0
with torch.no_grad(), autocast():
for xb, yb in val_loader:
xb, yb = xb.to(device), yb.to(device)
preds = model(xb)
val_loss += F.cross_entropy(preds, yb).item()
correct += (preds.argmax(1) == yb).sum().item()
val_loss /= len(val_loader)
acc = correct / len(val_ds)
print(f"Epoch {epoch:02d} | TrainLoss {train_loss/len(train_loader):.4f} "
f"| ValLoss {val_loss:.4f} | ValAcc {acc:.3f}")
# ベストモデル保存
if val_loss < best_val_loss:
best_val_loss = val_loss
torch.save(model.state_dict(), "best_model.pt")
print(" >> Best model saved")
8.Tensorと数学的基底
Tensorを理解するとき、しばしば数学の「基底」という考え方が役に立つ。
基底とは、ある空間をどの軸で表現するかを決める座標のようなものだ。
たとえば2次元平面なら、横軸と縦軸という基底を選ぶことで「点」を座標で表すことができる。
Tensorは数字の塊だが、その塊をどう解釈するかは「どの基底で見ているか」に依存する。
画像データでは「高さ・幅・チャンネル」という基底でTensorを構築する。文章なら「系列長・埋め込み次元」という基底を持たせることで自然言語を表現できる。
音声なら「時間・周波数」という基底でスペクトログラムとしてTensor化することが多い。
基底を変えると、同じデータでもTensorの形や活用方法が大きく変わる。
音声をそのまま時間軸の基底で使えば波形解析になるが、周波数軸に基底変換すれば画像と同じ処理(CNN)が可能になる。
文章も単語単位の基底で扱うか、サブワード単位の基底で扱うかで、モデルの学習精度や適応範囲が変わる。
数学的に言えば、基底を変えるとは座標変換であり、Tensorの表現の仕方を変える操作だ。
AIにおいては、データの基底をどう設計するかが、モデルの性能や応用範囲を決める重要なステップになる。
だから研究や実務では「このデータはどの基底でTensor化すべきか」という視点が常に問われるのだ。
出典:DIBEOS
まとめ
ニューラルネットワークは、ニューロンの単純な式 y = f(x·w + b)
の積み重ねにすぎない。
だがTensorを使うことで、それを行列演算として一気に処理できる。
PythonとPyTorchを使えば、基礎から業務レベルまで同じフレームワークで実装できるのが強みだ。
もしあなたがPython開発者として一歩踏み出すなら、まずはTensorに慣れること。
その先には、実務の現場でも使えるニューラルネットワークの世界が広がっている。