Adam は重みごとに、勾配(m)と勾配の二乗(v)の2つの移動平均を持ち、それを使って各重みに固有のステップ幅を与えます。
すべての重みについて m = 0、v = 0 から始めます。勾配 g を持つ各ステップ t = 1, 2, 3, … について:
- m ← beta1 × m + (1 - beta1) × g
- v ← beta2 × v + (1 - beta2) × g²
- m̂ = m / (1 - beta1ᵗ)、v̂ = v / (1 - beta2ᵗ)(バイアス補正)
- w ← w - learning_rate × m̂ / (√v̂ + epsilon)
adam_steps(gradients, weights, learning_rate, beta1, beta2, epsilon) を実装し、gradients の各行ごとに1回、順番に更新してください。
入力
gradients: ステップごとに1行。各行は重みごとに1つの勾配を持ちます。
weights: 初期の重み。
learning_rate, beta1, beta2, epsilon: Adam のハイパーパラメータ(一般的には 0.001、0.9、0.999、0.00000001)。
出力
すべてのステップ後の重みを返してください。
制約
0 ≤ ステップ数 ≤ 1,000、1 ≤ 重みの数 ≤ 100
0 < learning_rate ≤ 1、0 ≤ beta1, beta2 < 1、0 < epsilon ≤ 0.001
-100 ≤ 各値 ≤ 100
例
入力:
beta1 = 0.9
beta2 = 0.999
epsilon = 1.0e-08
weights = [1.0]
gradients = [
[2.0]
]
learning_rate = 0.1
期待される出力:
[0.9]
解説
m = 0.1 × 2 = 0.2、v = 0.001 × 4 = 0.004。バイアス補正で m̂ = 0.2 / 0.1 = 2、v̂ = 0.004 / 0.001 = 4 となり、ステップは 0.1 × 2 / √4 = 0.1:w = 0.9。最初のステップでは、Adam は勾配の大きさに関係なく各重みを学習率ほど動かします。
入力:
beta1 = 0.9
beta2 = 0.999
epsilon = 1.0e-08
weights = [0.0, 0.0]
gradients = [
[100.0, 0.01]
]
learning_rate = 0.01
期待される出力:
[-0.01, -0.01]
解説
2つの勾配は 10,000 倍違いますが、どちらの重みも約 0.01 動いて [-0.01, -0.01] になります。Adam は各ステップを勾配自身の大きさでスケーリングします。
参考資料
-
例 1 未実行入力:
beta1 = 0.9 beta2 = 0.999 epsilon = 1.0e-08 weights = [1.0] gradients = [ [2.0] ] learning_rate = 0.1期待される出力:[0.9]あなたの出力 -
例 2 未実行入力:
beta1 = 0.9 beta2 = 0.999 epsilon = 1.0e-08 weights = [0.0, 0.0] gradients = [ [100.0, 0.01] ] learning_rate = 0.01期待される出力:[-0.01, -0.01]あなたの出力
提出時に非公開テスト4件も実行されます。
Pythonオンラインコンパイラ&デバッガー
Pythonコードをオンラインで実行・デバッグできます。サーバーモードでブレークポイントとステップ実行を使え、インストールは不要です。
🐍 このPythonオンライン実行環境について
CodeUtility Python Executor は、ブラウザ上でPythonコードを記述・実行・テストできるツールです — セットアップやインストールは不要です。安全なサンドボックス上で動作し、 3.10 から 3.13 までの実際のPythonバージョンをサポートします。
初めてPythonを学ぶ場合でも、ちょっとしたスニペットを試すときでも、ロジックをデバッグするときでも、 このツールは高速で集中できるコーディング環境を提供します。 内蔵コンソールで自由に試し、結果をすぐに確認できます。
Pythonの練習や素早いプロトタイピングのために軽量なオンラインIDEが必要な、初心者、学生、開発者に最適です。
同じ実行環境で、複数ファイル対応エディター、分離された実行ターミナル、ランタイム別ライブラリ、永続ワークスペース、共有、リアルタイム共同作業を利用できます。
この実行環境の使い方
ランタイムを選択し、ファイルを開くか作成してコードを記述し、[実行]を選択します。出力はターミナルに表示されます。サインインしたユーザーは、ワークスペースにファイルを保存し、ライブラリをインストールして、共有を通じて共同作業できます。
- バージョンを選択して現在のファイルを編集するか、ワークスペース内の別のファイルを開きます。
- コードを実行し、求められた場合はターミナルに入力して、保存された実行履歴を確認します。
- 複数のコードスニペットが必要な作業では、ライブラリ、ワークスペースツール、共有、チャットを利用します。
💡 上のエディタで試せるPythonの基礎とサンプル
1. 変数と定数の宣言
Pythonは動的型付けなので、型を明示的に宣言する必要はありません。組み込みの定数キーワードはありませんが、慣例として定数はすべて大文字で書きます。
# 変数
x = 10
pi = 3.14
name = "Alice"
is_active = True
# 定数(慣例)
MAX_USERS = 100
APP_NAME = "CodeUtility"
# 定数も再代入は可能(強制されない)
MAX_USERS = 200 # ⚠️ 技術的には可能だが非推奨
2. 条件分岐
if、elif、else ブロックでロジックを制御します。Python 3.10以降では、match-case をswitch-caseの代替として使えます。
# 従来の if-elif-else
x = 2
if x == 1:
print("一")
elif x == 2:
print("二")
else:
print("その他")
別案: match-case(Python 3.10+)
# Python 3.10+ が必要
x = 2
match x:
case 1:
print("一")
case 2:
print("二")
case _:
print("その他")
3. ループ
for はシーケンスの反復に使い、while は条件が真の間実行されます。
for i in range(3):
print(i)
count = 3
while count > 0:
print(count)
count -= 1
4. リスト
リストは順序を持つ可変のコレクションです。インデックスで要素にアクセスできます。
fruits = ["りんご", "バナナ"]
print(fruits[0])
print(len(fruits))
5. リストの操作
リストの追加・削除・スライス・反転ができます。内包表記を使うと簡潔に反復処理を書けます。
fruits.append("さくらんぼ")
fruits.insert(1, "キウイ")
fruits.remove("バナナ")
fruits.pop()
print(fruits[1:3])
print(fruits[::-1])
squares = [x*x for x in range(5)]
6. コンソール入出力
input() でユーザーから読み取り、print() で出力を表示します。
\n(改行文字)を使うか、print() を複数回呼び出すことで複数行を表示できます。
# 入力を読む
name = input("あなたの名前を入力してください: ")
print("こんにちは", name)
# 複数行を出力
print("1行目\n2行目\n3行目")
# あるいは print を複数回使う
print("A行")
print("B行")
print("C行")
7. 関数
関数はコードを整理し、再利用を可能にします。引数や戻り値を使いましょう。
def greet(name):
return "こんにちは " + name
print(greet("Alice"))
8. 辞書
キーと値のペアを保持します。キーは一意で、キーを使って値にアクセスします。
person = {"name": "Bob", "age": 25}
print(person["name"])
print(person.get("email", "未設定"))
9. 例外処理
try と except でエラーを捕捉し、適切に処理します。
try:
x = 1 / 0
except ZeroDivisionError:
print("0で割ることはできません")
10. ファイル入出力
open() を使ってファイルの読み書きを行います。
with open("data.txt", "w") as f:
f.write("こんにちは、世界")
with open("data.txt", "r") as f:
print(f.read())
11. 文字列操作
Pythonの文字列には、strip()、replace()、split() など強力なメソッドがあります。
text = " Hello World "
print(text.strip())
print(text.upper())
print(text.replace("Hello", "Hi"))
print(text.split())
12. クラスとオブジェクト
クラスで再利用可能な設計図を定義します。オブジェクトの初期化には __init__ を使います。
class Person:
def __init__(self, name):
self.name = name
def greet(self):
return "こんにちは、私は " + self.name
p = Person("Alice")
print(p.greet())
🐞 Pythonコードをオンラインでデバッグする方法
オンラインPythonデバッガーなら、PythonやIDEをインストールせずにロジックエラーを調査できます。サーバーモードでPython 3.10〜3.13を使用します。
- ランタイムメニューからサーバー版Pythonを選択します。
- 行番号の横をクリックしてブレークポイントを設定します。
- Debugを選択し、最初に一致するブレークポイントまで実行します。
- 現在行と変数を確認し、Continue、Step Over、Step Into、Step Outを使います。
- 終了するときはStopを選択します。
再現可能な小さなコードから始め、値が想定外になる直前にブレークポイントを置きましょう。サーバーモードではworkspaceのファイルやインストール済みライブラリも使えます。