言語モデルは確率分布から次のトークンを選びます。その分布は2つの設定で形が決まります。
- 'Top-k:ロジットが最も高い k 個のトークンだけを残します(ロジットが同じなら、インデックスが小さいほうが上位)。'
- '温度 T:ソフトマックスの前に、残したロジットを T で割ります。T が低いと選択は予測しやすく、T が高いとランダムになります。'
テストできるように、乱数は与えられます。
- 上位 k 個のトークンを残し、元のインデックスの昇順に並べます。
- 残したトークンについて softmax(logit / T) を計算します(e^x を計算する前に最大値を引きます)。
- リストを順にたどって確率を足していき、累積値が
random_valueを初めて超えたトークンのインデックスを返します。どれも超えない場合(丸め誤差)は、最後に残したトークンを返します。
k = 1 なら貪欲デコーディング、つまり常に最も確率の高いトークンを選びます。
sample_token(logits, temperature, k, random_value) を実装してください。
入力
logits: 語彙内のトークンごとに1つのスコア。
temperature: T、0 より大きい。
k: 残す上位トークンの数。
random_value: [0, 1) の乱数。
出力
選ばれたトークンのインデックスを返してください。
制約
1 ≤ k ≤ ロジットの数 ≤ 1,000
0 < temperature ≤ 100、0 ≤ random_value < 1
-100 ≤ 各ロジット ≤ 100
例
入力:
logits = [1.0, 3.0, 2.0, 0.5]
temperature = 1.0
k = 1
random_value = 0.99
期待される出力:
1
解説
k = 1 では最も高いロジット、インデックス 1 の 3.0 だけが残ります。その確率は 1 なので、乱数に関係なく選ばれます。これが貪欲デコーディングです。
入力:
logits = [2.0, 1.0, 0.0]
temperature = 1.0
k = 2
random_value = 0.8
期待される出力:
1
解説
Top-2 ではインデックス 0 と 1(ロジット 2 と 1)が残ります。ソフトマックスは約 0.731 と 0.269 です。累積値はインデックス 0 の後で 0.731(0.8 を超えない)、インデックス 1 の後で 1 なので、インデックス 1 が選ばれます。
参考資料
-
例 1 未実行入力:
logits = [1.0, 3.0, 2.0, 0.5] temperature = 1.0 k = 1 random_value = 0.99期待される出力:1あなたの出力 -
例 2 未実行入力:
logits = [2.0, 1.0, 0.0] temperature = 1.0 k = 2 random_value = 0.8期待される出力:1あなたの出力
提出時に非公開テスト4件も実行されます。 失敗したテストがあれば、そのテストが表示されます。チャレンジを解くとすべて見られます。
Online Go Compiler
Write, compile, run, and debug Go code online in a full-featured browser IDE. Work with multiple files, save your workspace, and collaborate in real time - no setup required.
🐹 この Go オンライン実行環境について
CodeUtility Go Executor は、インストールやセットアップ、ローカル環境なしで ブラウザから直接 Go コードを記述・実行できます。安全なサンドボックスで動作し、 実際の Go コンパイラのバージョン 1.19、1.20、1.21 に対応しています。
このツールはクラウド上で本物の Go プログラムをコンパイル・実行し、実践的な Go 環境を提供します。 短いスニペットのテスト、パッケージの実験、goroutine とチャネルを使った強力な並行処理の学習ができます。
変数、関数、構造体、スライス、マップ、インターフェース、エラー処理など、 Go の基礎を学んで練習するのに最適です。ローカルにツールをインストールする必要はありません。
初めて Go を触る方、バックエンドのロジックを試す方、並行処理の仕組みを学ぶ方など、どなたにも。 CodeUtility Go Executor は、クリーンで高速なブラウザベースの実行環境を提供し、Go コードをすぐに動かせます。
同じ実行環境で、複数ファイル対応エディター、分離された実行ターミナル、ランタイム別ライブラリ、永続ワークスペース、共有、リアルタイム共同作業を利用できます。
この実行環境の使い方
ランタイムを選択し、ファイルを開くか作成してコードを記述し、[実行]を選択します。出力はターミナルに表示されます。サインインしたユーザーは、ワークスペースにファイルを保存し、ライブラリをインストールして、共有を通じて共同作業できます。
- バージョンを選択して現在のファイルを編集するか、ワークスペース内の別のファイルを開きます。
- コードを実行し、求められた場合はターミナルに入力して、保存された実行履歴を確認します。
- 複数のコードスニペットが必要な作業では、ライブラリ、ワークスペースツール、共有、チャットを利用します。
💡 上で試せる Go の基本とサンプル
1. 変数と定数の宣言
変数は var または := で宣言します。定数は const を使います。
package main
var x int = 10
const Pi = 3.14
func main() {
name := "Alice"
isActive := true
println(x, Pi, name, isActive)
}
2. 条件分岐(if / switch)
Go はクリーンな構文の if-else と switch をサポートします。
x := 2
if x == 1 {
println("一")
} else if x == 2 {
println("二")
} else {
println("その他")
}
switch x {
case 1:
println("一")
case 2:
println("二")
default:
println("その他")
}
3. ループ
Go には for だけがありますが、while のようにも使えます。
for i := 0; i < 3; i++ {
println(i)
}
n := 3
for n > 0 {
println(n)
n--
}
4. 配列
配列は固定長です。可変長のリストにはスライスを使います。
var nums = [3]int{10, 20, 30}
println(nums[1])
5. スライス操作
スライスと組み込みの append、len、copy、およびスライス構文を使います。
fruits := []string{"apple", "banana"}
fruits = append(fruits, "cherry")
fruits = fruits[1:] // スライス
println(len(fruits))
for _, fruit := range fruits {
println(fruit)
}
6. コンソール入出力
fmt.Print、fmt.Scan、fmt.Println を使います。
import "fmt"
var name string
fmt.Print("名前を入力してください: ")
fmt.Scan(&name)
fmt.Println("こんにちは", name)
7. 関数
関数は func で宣言し、複数の戻り値を返せます。
func greet(name string) string {
return "こんにちは、" + name
}
message := greet("Alice")
println(message)
8. マップ
マップはキーと値のストアです。make() で作成します。
ages := map[string]int{"Alice": 30}
ages["Bob"] = 25
println(ages["Alice"])
9. エラー処理
Go では例外の代わりに、エラーを複数戻り値で扱います。
import "errors"
func fail() error {
return errors.New("問題が発生しました")
}
err := fail()
if err != nil {
println(err.Error())
}
10. ファイル I/O
ファイルの読み書きには os と io/ioutil パッケージを使います。
import (
"fmt"
"os"
"io/ioutil"
)
ioutil.WriteFile("file.txt", []byte("こんにちは、ファイル"), 0644)
data, _ := ioutil.ReadFile("file.txt")
fmt.Println(string(data))
11. 文字列操作
文字列操作には strings パッケージを使います。
import "strings"
text := " Hello World "
println(strings.TrimSpace(text))
println(strings.ToUpper(text))
println(strings.ReplaceAll(text, "Hello", "Hi"))
words := strings.Split(text, " ")
fmt.Println(words)
12. 構造体とオブジェクト
メソッド付きのカスタム型は struct で定義します。
type Person struct {
Name string
}
func (p Person) Greet() string {
return "こんにちは、私は " + p.Name
}
p := Person{Name: "Alice"}
println(p.Greet())
13. 参照(ポインタ)
Go は * と & を使ったポインタをサポートします。
x := 10
ptr := &x
*ptr = 20
println(x) // 20