- ตัวดำเนินการ
-
เรียนรู้
ศูนย์การเรียนรู้ Python ตัวอย่างที่รันได้, NumPy, pandas และอื่น ๆ ศูนย์การเรียนรู้ C และ C++ พอยน์เตอร์ หน่วยความจำ STL และ C++ สมัยใหม่ ศูนย์การเรียนรู้ C#พื้นฐาน C#, OOP, LINQ, async และแบบฝึกหัด .NET อัลกอริทึม Python การค้นหา การเรียงลำดับ รีเคอร์ชัน และภาพจำลอง O(n) อัลกอริทึม C และ C++ เปรียบเทียบการเขียนด้วย C และ C++
- โจทย์
Multi-head attention ทำให้ Transformer สนใจหลายสิ่งได้พร้อมกัน เมื่อมีอินพุต X (n token × d คอลัมน์) และเมทริกซ์น้ำหนักขนาด d × d:
- Q = X × w_q, K = X × w_k, V = X × w_v
- แบ่ง d คอลัมน์เป็น
num_headshead head ละ d_k = d / num_heads คอลัมน์ติดกัน (head h ใช้คอลัมน์ h×d_k ถึง (h+1)×d_k - 1) - สำหรับแต่ละ head ให้รัน scaled dot-product attention บนคอลัมน์ของมัน: สำหรับ token i, score_j = (Q_i · K_j) / √d_k บนคอลัมน์ของ head นั้น, softmax บนทุก token j ทั้ง n ตัว และเอาต์พุต = Σ weight_j × V_j (คอลัมน์ของ head นั้น)
- นำเอาต์พุตของแต่ละ head กลับไปใส่ในคอลัมน์ของมัน (concatenation) แล้วคูณด้วย w_o
จง implement multi_head_attention(x, w_q, w_k, w_v, w_o, num_heads)
อินพุต
x: เมทริกซ์อินพุตขนาด n × d
w_q, w_k, w_v, w_o: เมทริกซ์น้ำหนักขนาด d × d
num_heads: จำนวน head (d หารด้วยจำนวนนี้ลงตัว)
เอาต์พุต
คืนค่าเมทริกซ์เอาต์พุตขนาด n × d
เงื่อนไข
1 ≤ n ≤ 30, 1 ≤ d ≤ 32, 1 ≤ num_heads ≤ d และ d หารด้วย num_heads ลงตัว
-5 ≤ แต่ละค่า ≤ 5
ตัวอย่าง
ตัวอย่างที่ 1
อินพุต:
x = [
[1.0, 0.0],
[0.0, 1.0]
]
w_k = [
[1.0, 0.0],
[0.0, 1.0]
]
w_o = [
[1.0, 0.0],
[0.0, 1.0]
]
w_q = [
[0.0, 0.0],
[0.0, 0.0]
]
w_v = [
[1.0, 0.0],
[0.0, 1.0]
]
num_heads = 1
ผลลัพธ์ที่คาดหวัง:
[
[0.5, 0.5],
[0.5, 0.5]
]
คำอธิบาย
w_q เป็นศูนย์ทั้งหมด ดังนั้นคะแนนทุกตัวเป็น 0 และแต่ละ token เฉลี่ยแถว value: V = X ดังนั้นทั้งสองแถวกลายเป็น [0.5, 0.5]
ตัวอย่างที่ 2
อินพุต:
x = [
[2.0, 4.0]
]
w_k = [
[1.0, 0.0],
[0.0, 1.0]
]
w_o = [
[0.0, 1.0],
[1.0, 0.0]
]
w_q = [
[1.0, 0.0],
[0.0, 1.0]
]
w_v = [
[1.0, 0.0],
[0.0, 1.0]
]
num_heads = 2
ผลลัพธ์ที่คาดหวัง:
[
[4.0, 2.0]
]
คำอธิบาย
เมื่อมี token เดียว แต่ละ head สนใจแค่ตัวเอง ดังนั้นเอาต์พุตที่ต่อกันคือ V = [2, 4] แล้ว w_o สลับสองคอลัมน์: [4, 2]
แหล่งอ้างอิง
-
ตัวอย่างที่ 1 ยังไม่ได้รันอินพุต:
x = [ [1.0, 0.0], [0.0, 1.0] ] w_k = [ [1.0, 0.0], [0.0, 1.0] ] w_o = [ [1.0, 0.0], [0.0, 1.0] ] w_q = [ [0.0, 0.0], [0.0, 0.0] ] w_v = [ [1.0, 0.0], [0.0, 1.0] ] num_heads = 1ผลลัพธ์ที่คาดหวัง:[ [0.5, 0.5], [0.5, 0.5] ]เอาต์พุตของคุณ -
ตัวอย่างที่ 2 ยังไม่ได้รันอินพุต:
x = [ [2.0, 4.0] ] w_k = [ [1.0, 0.0], [0.0, 1.0] ] w_o = [ [0.0, 1.0], [1.0, 0.0] ] w_q = [ [1.0, 0.0], [0.0, 1.0] ] w_v = [ [1.0, 0.0], [0.0, 1.0] ] num_heads = 2ผลลัพธ์ที่คาดหวัง:[ [4.0, 2.0] ]เอาต์พุตของคุณ
มี 4 การทดสอบที่ซ่อนอยู่จะถูกรันเมื่อคุณส่งคำตอบ
คอมไพเลอร์และดีบักเกอร์ C# ออนไลน์
เขียน คอมไพล์ รัน และดีบัก C# ออนไลน์ ใช้ breakpoint การทำงานทีละขั้น และการตรวจสอบออบเจ็กต์ใน IDE หลายไฟล์โดยไม่ต้องใช้ Visual Studio
🚀 350,748 การดำเนินการทั้งหมด (2 ในเดือนนี้)
ฝึก C# ด้วยโจทย์เขียนโค้ด
แก้โจทย์จริงใน editor นี้: รันทดสอบตัวอย่าง ส่งคำตอบ และรับรีวิวโค้ดจาก AI
🔷 เกี่ยวกับตัวรัน C# / .NET ออนไลน์นี้
CodeUtility C# Executor ช่วยให้คุณเขียนและรันโค้ด C# จริงได้โดยตรงในเบราว์เซอร์ของคุณ - ไม่ต้องติดตั้ง ไม่ต้องตั้งค่า Visual Studio หรือ .NET SDK ใช้งานผ่านแซนด์บ็อกซ์ที่ปลอดภัยซึ่งรองรับ .NET runtime และเวอร์ชันภาษา C# สมัยใหม่ รวมถึง C# 9 และใหม่กว่านั้น
เครื่องมือนี้ใช้ dotnet-script เบื้องหลังในการคอมไพล์และรันโค้ดของคุณด้วยพฤติกรรม .NET แท้ๆ ทำให้คุณลองเล่นได้ทั้งฟีเจอร์ C# พื้นฐานและขั้นสูง เช่น LINQ, async/await, pattern matching และ generics
คุณสามารถทดสอบสคริปต์ง่ายๆ ฟังก์ชัน และลำดับตรรกะ หรือสำรวจแนวคิดอย่างคลาส โครงสร้าง (structs), การสืบทอด (inheritance) และอินเทอร์เฟซ - ทั้งหมดนี้ในสภาพแวดล้อมการเขียนโค้ดที่สะอาดและปราศจากสิ่งรบกวน
ไม่ว่าคุณกำลังเรียนรู้ C#, ทดสอบอัลกอริทึมหรือทดลองฟีเจอร์ .NET เครื่องมือ CodeUtility C# Executor มอบวิธีที่รวดเร็ว ปลอดภัย และเชื่อถือได้ในการรันโค้ด C# ได้ทันทีจากทุกเบราว์เซอร์
มากกว่าเครื่องมือรันโค้ด
ใช้ตัวแก้ไขหลายไฟล์ เทอร์มินัลประมวลผลแบบแยกส่วน ไลบรารีเฉพาะรันไทม์ พื้นที่ทำงานถาวร การแชร์ และการทำงานร่วมกันแบบเรียลไทม์ได้จากตัวประมวลผลเดียวกัน
วิธีใช้ตัวประมวลผลนี้
เลือกรันไทม์ เปิดหรือสร้างไฟล์ เขียนโค้ด แล้วเลือกเรียกใช้ ผลลัพธ์จะแสดงในเทอร์มินัล ส่วนผู้ใช้ที่ลงชื่อเข้าใช้สามารถเก็บไฟล์ในพื้นที่ทำงาน ติดตั้งไลบรารี และทำงานร่วมกันผ่านการแชร์ได้
- เลือกเวอร์ชันแล้วแก้ไขไฟล์ปัจจุบัน หรือเปิดไฟล์อื่นในพื้นที่ทำงาน
- เรียกใช้โค้ด ป้อนข้อมูลในเทอร์มินัลเมื่อระบบร้องขอ และตรวจสอบประวัติการเรียกใช้ที่บันทึกไว้
- ใช้ไลบรารี เครื่องมือพื้นที่ทำงาน การแชร์ และแชท เมื่องานของคุณต้องใช้โค้ดมากกว่าหนึ่งส่วน
💡 พื้นฐาน C# และตัวอย่างที่คุณลองได้ด้านบน
1. การประกาศตัวแปรและค่าคงที่
C# ใช้การประกาศตัวแปรแบบชนิดชัดเจน (strongly-typed) ใช้ const สำหรับค่าคงที่ตอนคอมไพล์ และ readonly สำหรับค่าคงที่ตอนรันไทม์
int age = 30;
double pi = 3.14159;
char grade = 'A';
string name = "Alice";
bool isActive = true;
// ค่าคงที่
const int MaxUsers = 100;
const string Company = "CodeUtility";
2. เงื่อนไข (if / switch)
ใช้ if, else if และ switch เพื่อควบคุมโฟลว์การทำงาน
int x = 2;
if (x == 1)
{
Console.WriteLine("หนึ่ง");
}
else if (x == 2)
{
Console.WriteLine("สอง");
}
else
{
Console.WriteLine("อื่น ๆ");
}
switch (x)
{
case 1:
Console.WriteLine("หนึ่ง");
break;
case 2:
Console.WriteLine("สอง");
break;
default:
Console.WriteLine("อื่น ๆ");
break;
}
3. ลูป
C# รองรับลูปแบบ for, while และ foreach
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i);
}
int n = 3;
while (n > 0)
{
Console.WriteLine(n);
n--;
}
4. อาเรย์
อาเรย์ใช้เก็บคอลเลกชันขนาดคงที่ของสมาชิกชนิดเดียวกัน
int[] numbers = { 10, 20, 30 };
Console.WriteLine(numbers[1]);
5. การจัดการรายการ (List)
ใช้ List<T> สำหรับคอลเลกชันที่ยืดหยุ่นได้ (ไดนามิก)
List<int> nums = new List<int> { 1, 2, 3 };
nums.Add(4);
nums.Remove(2);
foreach (int n in nums)
{
Console.Write(n + " ");
}
6. อินพุต/เอาต์พุตคอนโซล
ใช้ Console.WriteLine และ Console.ReadLine สำหรับ I/O พื้นฐาน
Console.Write("กรอกชื่อของคุณ: ");
string name = Console.ReadLine();
Console.WriteLine($"สวัสดี, {name}!");
7. ฟังก์ชัน
กำหนดเมธอดโดยระบุชนิดค่าที่ส่งคืน ชื่อ และพารามิเตอร์
int Add(int a, int b)
{
return a + b;
}
Console.WriteLine(Add(3, 4));
8. ดิกชันนารี
Dictionary<TKey, TValue> ใช้เก็บคู่คีย์-ค่า
Dictionary<string, int> ages = new Dictionary<string, int>();
ages["Alice"] = 30;
Console.WriteLine(ages["Alice"]);
9. การจัดการข้อยกเว้น
จัดการข้อผิดพลาดขณะรันด้วย try, catch, และ finally
try
{
throw new Exception("มีบางอย่างผิดพลาด");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
10. การทำงานกับไฟล์ (File I/O)
ใช้ File และ StreamReader/StreamWriter สำหรับการทำงานกับไฟล์
File.WriteAllText("file.txt", "สวัสดีไฟล์");
string text = File.ReadAllText("file.txt");
Console.WriteLine(text);
11. การจัดการสตริง
สตริงใน C# รองรับเมธอดอย่าง Length, Substring, Contains
string message = "Hello World";
Console.WriteLine(message.Length);
Console.WriteLine(message.Substring(0, 5));
Console.WriteLine(message.Contains("World"));
12. คลาสและออบเจ็กต์
C# รองรับการเขียนโปรแกรมเชิงวัตถุผ่านคลาสและออบเจ็กต์
class Person
{
public string Name;
public Person(string name) => Name = name;
public void Greet() => Console.WriteLine($"สวัสดี ฉันชื่อ {Name}");
}
Person p = new Person("Alice");
p.Greet();