คำถามติดแท็ก reinforcement-learning

ชุดของกลยุทธ์แบบไดนามิกที่อัลกอริทึมสามารถเรียนรู้โครงสร้างของสภาพแวดล้อมทางออนไลน์โดยปรับการดำเนินการที่เกี่ยวข้องกับผลตอบแทนที่แตกต่างกันเพื่อเพิ่มผลตอบแทนสูงสุดที่ได้รับ

5
อะไรคือความแตกต่างระหว่างการเรียนรู้นอกระบบกับการเรียนรู้นอกห้องเรียน?
เว็บไซต์ปัญญาประดิษฐ์กำหนดการเรียนรู้นอกห้องเรียนและนอกนโยบายดังนี้ "ผู้เรียนนอกนโยบายเรียนรู้คุณค่าของนโยบายที่ดีที่สุดโดยไม่ขึ้นกับการกระทำของตัวแทน Q-learning เป็นผู้เรียนนอกนโยบายผู้เรียนตามนโยบายจะได้เรียนรู้คุณค่าของนโยบายที่ดำเนินการโดยตัวแทนรวมถึงขั้นตอนการสำรวจ ." ฉันต้องการขอคำชี้แจงของคุณเกี่ยวกับเรื่องนี้เพราะพวกเขาดูเหมือนจะไม่สร้างความแตกต่างให้ฉัน คำจำกัดความทั้งสองดูเหมือนว่าเหมือนกัน สิ่งที่ฉันเข้าใจจริง ๆ คือการเรียนรู้โดยใช้แบบจำลองและแบบจำลองและฉันไม่รู้ว่าพวกเขามีส่วนเกี่ยวข้องกับสิ่งที่สงสัยหรือไม่ เป็นไปได้อย่างไรที่นโยบายที่ดีที่สุดจะได้รับการเรียนรู้อย่างอิสระจากการกระทำของตัวแทน นโยบายไม่ได้เรียนรู้เมื่อตัวแทนดำเนินการหรือไม่

3
ทำความเข้าใจเกี่ยวกับบทบาทของปัจจัยส่วนลดในการเรียนรู้การเสริมแรง
ฉันสอนตัวเองเกี่ยวกับการเรียนรู้การเสริมแรงและพยายามทำความเข้าใจแนวคิดของรางวัลที่ได้รับส่วนลด ดังนั้นรางวัลจึงมีความจำเป็นที่จะต้องบอกระบบว่าคู่กรรมของรัฐนั้นดีและอะไรไม่ดี แต่สิ่งที่ฉันไม่เข้าใจคือเหตุผลว่าทำไมจึงจำเป็นต้องให้รางวัลส่วนลด เหตุใดจึงสำคัญว่ารัฐที่มีฐานะดีจะมาถึงในไม่ช้าแทนที่จะเป็นในภายหลังหรือไม่ ฉันเข้าใจว่านี่เกี่ยวข้องในบางกรณี ตัวอย่างเช่นหากคุณใช้การเรียนรู้การเสริมแรงเพื่อแลกเปลี่ยนในตลาดหุ้นมันจะมีประโยชน์มากขึ้นในการทำกำไรได้เร็วกว่าแทนที่จะทำภายหลัง นี่เป็นเพราะการมีเงินในตอนนี้ช่วยให้คุณสามารถทำสิ่งต่าง ๆ ด้วยเงินในตอนนี้ซึ่งเป็นที่ต้องการมากกว่าทำเงินด้วยเงินในภายหลัง แต่ในกรณีส่วนใหญ่ฉันไม่เห็นว่าทำไมการลดราคาจึงมีประโยชน์ ตัวอย่างเช่นสมมติว่าคุณต้องการให้หุ่นยนต์เรียนรู้วิธีนำทางไปรอบ ๆ ห้องเพื่อไปถึงอีกด้านหนึ่งซึ่งมีบทลงโทษหากมันชนกับสิ่งกีดขวาง หากไม่มีปัจจัยส่วนลดแล้วมันจะเรียนรู้ที่จะไปถึงอีกด้านอย่างสมบูรณ์แบบโดยไม่ชนกับสิ่งกีดขวางใด ๆ อาจใช้เวลานานในการไปถึงที่นั่น แต่มันจะไปถึงที่นั่นในที่สุด แต่ถ้าเรามอบส่วนลดให้กับรางวัลหุ่นยนต์จะได้รับการกระตุ้นให้ไปถึงอีกด้านหนึ่งของห้องได้อย่างรวดเร็วแม้ว่ามันจะต้องชนกับวัตถุตามทาง เห็นได้ชัดว่าไม่ใช่ผลลัพธ์ที่ต้องการ แน่นอนว่าคุณต้องการให้หุ่นยนต์ไปด้านอื่น ๆ อย่างรวดเร็ว แต่ไม่ใช่ถ้านี่หมายความว่ามันจะต้องชนกับวัตถุระหว่างทาง ดังนั้นสัญชาตญาณของฉันคือปัจจัยรูปแบบส่วนลดใด ๆ ที่จริงจะนำไปสู่การแก้ปัญหาย่อยที่ดีที่สุด และตัวเลือกของตัวลดราคามักจะเป็นแบบสุ่ม - หลายวิธีที่ฉันได้เห็นเพียงตั้งค่าเป็น 0.9 สิ่งนี้ดูเหมือนจะไร้เดียงสามากสำหรับฉันและดูเหมือนจะเป็นการแลกเปลี่ยนโดยพลระหว่างวิธีการแก้ปัญหาที่เหมาะสมที่สุดและวิธีแก้ปัญหาที่เร็วที่สุด แต่ในความเป็นจริงการแลกเปลี่ยนนี้มีความสำคัญมาก กรุณามีใครช่วยให้ฉันเข้าใจทั้งหมดนี้ไหม ขอขอบคุณ :)

2
เหตุใดจึงไม่มีเครื่องมือการเรียนรู้การเสริมลึกสำหรับหมากรุกคล้ายกับ AlphaGo?
คอมพิวเตอร์มีเวลานานที่จะสามารถเล่นหมากรุกโดยใช้ "กำลังดุร้าย" - เทคนิคค้นหาความลึกระดับหนึ่งแล้วประเมินตำแหน่ง อย่างไรก็ตามคอมพิวเตอร์ AlphaGo ใช้ ANN เพื่อประเมินตำแหน่งเท่านั้น (มันไม่ทำการค้นหาเชิงลึกเท่าที่ฉันรู้) เป็นไปได้ไหมที่จะสร้างเอ็นจิ้นหมากรุกที่เล่นหมากรุกในแบบเดียวกับ AlphaGo เล่น Go? ทำไมไม่มีใครทำอย่างนี้? โปรแกรมนี้จะทำงานได้ดีกว่าโปรแกรมหมากรุกชั้นนำ (และผู้เล่นหมากรุก) ในปัจจุบันหรือไม่?

9
ได้รับสมการของเบลล์แมนในการเสริมการเรียนรู้
ฉันเห็นสมการต่อไปนี้ใน " ในการเสริมการเรียนรู้การแนะนำ " แต่ไม่ทำตามขั้นตอนที่ฉันเน้นด้วยสีน้ำเงินด้านล่าง ขั้นตอนนี้เกิดขึ้นได้อย่างไร

2
การเรียนรู้แบบมีผู้เรียนการเรียนรู้แบบไม่มีผู้ดูแลและการเสริมแรง: พื้นฐานการทำงาน
การเรียนรู้ภายใต้การดูแล 1) มนุษย์สร้างลักษณนามอยู่บนพื้นฐานของการป้อนข้อมูลและการส่งออกข้อมูล 2) ลักษณนามนั้นได้รับการฝึกอบรมพร้อมชุดข้อมูลการฝึกอบรม 3) ลักษณนามนั้นทดสอบด้วยชุดข้อมูลทดสอบ 4) การปรับใช้ถ้าผลลัพธ์เป็นที่น่าพอใจ หากต้องการใช้เมื่อ "ฉันรู้วิธีจัดประเภทข้อมูลนี้ฉันแค่ต้องการให้คุณ (ตัวจําแนก) เพื่อจัดเรียงข้อมูล" จุดของวิธีการ: ใช้ป้ายกำกับคลาสหรือสร้างจำนวนจริง การเรียนรู้ที่ไม่จำเป็น 1) มนุษย์สร้างอัลกอริทึมบนพื้นฐานของการป้อนข้อมูล 2) อัลกอริทึมนั้นทดสอบด้วยชุดทดสอบข้อมูล (ซึ่งอัลกอริทึมสร้างลักษณนาม) 3) การปรับใช้ถ้าลักษณนามเป็นที่น่าพอใจ เมื่อต้องการใช้เมื่อ "ฉันไม่รู้ว่าจะจัดประเภทข้อมูลนี้ได้อย่างไรคุณ (อัลกอริทึม) สามารถสร้างตัวจําแนกสำหรับฉันได้หรือไม่" จุดของวิธีการ: ใช้ป้ายกำกับคลาสหรือทำนาย (PDF) เสริมการเรียนรู้ 1) มนุษย์สร้างอัลกอริทึมบนพื้นฐานของการป้อนข้อมูล 2) อัลกอริทึมนั้นนำเสนอสถานะที่ขึ้นอยู่กับข้อมูลอินพุตที่ผู้ใช้ให้รางวัลหรือลงโทษอัลกอริทึมผ่านการกระทำที่อัลกอริทึมดำเนินการซึ่งจะดำเนินต่อไปตามกาลเวลา 3) อัลกอริทึมนั้นเรียนรู้จากการให้รางวัล / การลงโทษและอัปเดตตัวเองซึ่งจะดำเนินต่อไป 4) มันอยู่ในการผลิตเสมอมันต้องเรียนรู้ข้อมูลจริงเพื่อให้สามารถนำเสนอการกระทำจากรัฐ เพื่อใช้เมื่อ "ฉันไม่รู้ว่าจะจำแนกข้อมูลนี้อย่างไรคุณสามารถจำแนกข้อมูลนี้และฉันจะให้รางวัลแก่คุณหากมันถูกต้องหรือฉันจะลงโทษคุณหากไม่ใช่" นี่คือการไหลของการปฏิบัติเหล่านี้ฉันได้ยินมามากมายเกี่ยวกับสิ่งที่พวกเขาทำ แต่ข้อมูลที่เป็นประโยชน์และเป็นแบบอย่างนั้นน่ากลัวเล็กน้อย!

3
ขั้นตอนวิธีโจรที่ดีที่สุด?
อัลกอริทึมโจรที่รู้จักกันดีที่สุดคือขอบเขตความเชื่อมั่นสูงสุด (UCB) ซึ่งเป็นที่นิยมของอัลกอริทึมระดับนี้ ตั้งแต่นั้นมาฉันคิดว่าตอนนี้มีอัลกอริทึมที่ดีกว่า อัลกอริทึมที่ดีที่สุดในปัจจุบันคืออะไร (ในแง่ของประสิทธิภาพเชิงประจักษ์หรือขอบเขตทางทฤษฎี) อัลกอริทึมนี้เหมาะสมที่สุดในแง่หนึ่งหรือไม่?

3
การวิเคราะห์อนุกรมเวลารายวัน
ฉันกำลังพยายามทำการวิเคราะห์อนุกรมเวลาและยังใหม่กับฟิลด์นี้ ฉันมีการนับเหตุการณ์ทุกวันตั้งแต่ปี 2549-2552 และฉันต้องการให้พอดีกับแบบจำลองอนุกรมเวลา นี่คือความก้าวหน้าที่ฉันได้ทำ: timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25) plot.ts(timeSeriesObj) พล็อตผลที่ฉันได้รับคือ: เพื่อตรวจสอบว่ามีฤดูกาลและแนวโน้มในข้อมูลหรือไม่ฉันทำตามขั้นตอนที่กล่าวถึงในโพสต์นี้: ets(x) fit <- tbats(x) seasonal <- !is.null(fit$seasonal) seasonal และในบล็อกของ Rob J Hyndman : library(fma) fit1 <- ets(x) fit2 <- ets(x,model="ANN") deviance <- 2*c(logLik(fit1) - logLik(fit2)) df <- attributes(logLik(fit1))$df - attributes(logLik(fit2))$df #P value 1-pchisq(deviance,df) ทั้งสองกรณีระบุว่าไม่มีฤดูกาล เมื่อฉันพล็อต ACF & PACF ของซีรีส์นี่คือสิ่งที่ฉันได้รับ: …

4
คุณจะออกแบบระบบการเรียนรู้ของเครื่องเพื่อเล่น Angry Birds ได้อย่างไร?
หลังจากเล่น Angry Birds มากเกินไปฉันเริ่มสังเกตกลยุทธ์ของตัวเอง ปรากฎว่าฉันพัฒนาวิธีที่เฉพาะเจาะจงมากในการรับ 3 ดาวในแต่ละระดับ นั่นทำให้ฉันสงสัยเกี่ยวกับความท้าทายในการพัฒนาระบบการเรียนรู้ของเครื่องที่สามารถเล่น Angry Birds ได้ การมีปฏิสัมพันธ์กับเกมและการยิงนกเป็นเรื่องเล็กน้อย แต่คำถามหนึ่งที่ฉันมีคือเกี่ยวกับ "การสร้างบล็อค" ของระบบ ระบบการเรียนรู้ของเครื่องดูเหมือนจะทำงานกับแนวคิดที่เรียบง่ายหรือความเข้าใจเกี่ยวกับปัญหา สิ่งนี้มักถูกเข้ารหัสเป็นฟีเจอร์เช่นอินพุต ดังนั้นดูเหมือนว่าระบบจะต้องมีความสามารถในการเข้าใจแนวคิดระดับสูงบางอย่างเพื่อสร้างกลยุทธ์ มันเป็นเรื่องจริงเหรอ? นอกจากนี้ความท้าทายหรือส่วนที่ยากของการพัฒนาระบบดังกล่าวคืออะไร? แก้ไข # 1: นี่คือคำชี้แจงบางอย่าง รับ 3 ดาวเป็นปัญหายากเนื่องจากคุณต้องเพิ่มคะแนน วิธีนี้สามารถทำได้สองวิธีที่ไม่พิเศษ: 1) ลดจำนวนนกที่ใช้ (คุณจะได้รับ 10,000 คะแนนสำหรับนกที่ไม่ได้ใช้ทุกครั้ง) 2) เพิ่มการทำลายกระจกไม้และวัตถุอื่น ๆ วัตถุแต่ละชิ้นที่ถูกทำลายจะให้คะแนนกับคุณ เป็นไปได้ที่จะทำลายวัตถุมากกว่า 10,000 แต้มด้วยนกเพียงตัวเดียว ต่อไปนี้เป็นคำอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับ "แนวคิดระดับสูง" เพื่อให้ได้คะแนนสูงสุดตามที่อธิบายไว้ข้างต้นคุณต้องใช้พลังพิเศษของนกแต่ละตัว ดังนั้นนั่นหมายถึงการเปิดตัวนกที่แตกต่างกันด้วยวิถีที่แตกต่างกันขึ้นอยู่กับรูปแบบของแผนที่ และในขณะที่เล่นฉันพัฒนากลยุทธ์ที่ทำลายพื้นที่บางอย่างกับนกบางตัวในลำดับที่แน่นอน ดูเหมือนว่าหากไม่มีความเข้าใจในการใช้นกแต่ละตัวเพื่อทำลายพื้นที่เฉพาะระบบจะไม่สามารถเรียนรู้ที่จะได้รับ 3 ดาว ดังนั้นคุณจะจัดการและเข้ารหัสสิ่งเช่นนั้นได้อย่างไร คุณมั่นใจได้อย่างไรว่าระบบสามารถเรียนรู้แนวคิดระดับสูงเหล่านี้ได้?

2
การเรียนรู้การเสริมแรงที่เกิดขึ้นคืออะไร
ฉันเพิ่งเจอคำว่า "การเรียนรู้เสริมกำลังกำเริบ" ฉันเข้าใจว่า "เครือข่ายประสาทที่เกิดขึ้นอีก" คืออะไรและ "การเรียนรู้การเสริมแรง" คืออะไร แต่ไม่สามารถหาข้อมูลได้มากนักเกี่ยวกับสิ่งที่ มีคนอธิบายให้ฉันได้ไหมว่า "การเรียนรู้การเสริมแรงแบบเกิดซ้ำ" กับอะไรคือความแตกต่างระหว่าง "การเรียนรู้การเสริมแรงแบบกำเริบ" และสิ่งที่ปกติคือ

1
เมื่อใดที่ต้องเลือก SARSA เทียบกับการเรียนรู้ Q
SARSA และ Q Learning เป็นทั้งอัลกอริทึมการเรียนรู้เสริมที่ทำงานในลักษณะเดียวกัน ความแตกต่างที่โดดเด่นที่สุดคือ SARSA อยู่ในนโยบายขณะที่ Q Learning ปิดนโยบาย กฎการอัพเดทมีดังนี้: การเรียนรู้ Q: Q(st,at)←Q(st,at)+α[rt+1+γmaxa′Q(st+1,a′)−Q(st,at)]Q(st,at)←Q(st,at)+α[rt+1+γmaxa′Q(st+1,a′)−Q(st,at)]Q(s_t,a_t)←Q(s_t,a_t)+α[r_{t+1}+γ\max_{a'}Q(s_{t+1},a')−Q(s_t,a_t)] ซาร์ซา: Q(st,at)←Q(st,at)+α[rt+1+γQ(st+1,at+1)−Q(st,at)]Q(st,at)←Q(st,at)+α[rt+1+γQ(st+1,at+1)−Q(st,at)]Q(s_t,a_t)←Q(s_t,a_t)+α[r_{t+1}+γQ(s_{t+1},a_{t+1})−Q(s_t,a_t)] โดยที่st,atst,ats_t,\,a_tและrtrtr_tเป็นสถานะการกระทำและรางวัล ณ ขั้นตอนtttและγγ\gammaเป็นปัจจัยลดราคา พวกเขาส่วนใหญ่มีลักษณะเดียวกันยกเว้นใน SARSA เราดำเนินการจริงและในการเรียนรู้ Q เราดำเนินการด้วยรางวัลสูงสุด มีการตั้งค่าทางทฤษฎีหรือภาคปฏิบัติที่ควรเลือกอย่างใดอย่างหนึ่งมากกว่าอีกอันหนึ่งหรือไม่? ฉันเห็นได้ว่าการใช้ Q สูงสุดในการเรียนรู้นั้นมีค่าใช้จ่ายสูงและมากขึ้นเรื่อย ๆ ในพื้นที่ปฏิบัติการต่อเนื่อง แต่มีอะไรอีกบ้าง?

4
ทำไม Q-Learning ใช้ epsilon-โลภในระหว่างการทดสอบ?
ในบทความของ DeepMind เกี่ยวกับ Deep Q-Learning สำหรับวิดีโอเกมอาตาริ ( ที่นี่ ) พวกเขาใช้วิธีการ epsilon-โลภสำหรับการสำรวจในระหว่างการฝึกอบรม ซึ่งหมายความว่าเมื่อมีการเลือกการดำเนินการในการฝึกอบรมจะมีการเลือกว่าเป็นการกระทำที่มีค่า q สูงสุดหรือการกระทำแบบสุ่ม การเลือกระหว่างสองสิ่งนี้คือการสุ่มและขึ้นอยู่กับมูลค่าของ epsilon และ epsilon จะถูกทำให้อ่อนลงในระหว่างการฝึกอบรมซึ่งในขั้นต้นจะมีการดำเนินการแบบสุ่มจำนวนมาก (การสำรวจ) แต่ในขณะที่การฝึกอบรมดำเนินไป (การแสวงหาผลประโยชน์) จากนั้นในระหว่างการทดสอบพวกเขายังใช้วิธี epsilon-greedy แต่ด้วย epsilon ที่ค่าต่ำมากเช่นนั้นมีอคติที่แข็งแกร่งต่อการแสวงหาผลประโยชน์มากกว่าการสำรวจโดยนิยมเลือกการกระทำที่มีค่า q สูงกว่าการกระทำแบบสุ่ม อย่างไรก็ตามการกระทำแบบสุ่มบางครั้งยังคงถูกเลือก (5% ของเวลา) คำถามของฉันคือ: ทำไมการสำรวจใด ๆ ที่จำเป็นในตอนนี้เนื่องจากการฝึกอบรมได้ทำไปแล้ว? หากระบบได้เรียนรู้นโยบายที่ดีที่สุดแล้วเหตุใดจึงไม่สามารถเลือกการกระทำเป็นรายการที่มีค่า q สูงสุดได้เสมอ ไม่ควรทำการสำรวจเท่านั้นในการฝึกอบรมและเมื่อเรียนรู้นโยบายที่เหมาะสมแล้วตัวแทนก็สามารถเลือกการกระทำที่เหมาะสมที่สุดซ้ำ ๆ ได้? ขอบคุณ!

2
วิธีการสร้างฟังก์ชั่นตอบแทนในการเรียนรู้เสริม
ในขณะที่เรียนเสริมการเรียนรู้ฉันได้พบฟังก์ชั่นของรางวัลหลายรูปแบบ: , R ( s , a , s ′ )และแม้แต่ฟังก์ชั่นของรางวัลที่ขึ้นอยู่กับสถานะปัจจุบันเท่านั้น ต้องบอกว่าฉันรู้ว่ามันไม่ใช่เรื่องง่ายที่จะ 'สร้าง' หรือ 'กำหนด' ฟังก์ชั่นของรางวัลR(s,a)R(s,a)R(s,a)R(s,a,s′)R(s,a,s′)R(s,a,s') นี่คือคำถามของฉัน: มีกฎเกี่ยวกับวิธีการทำฟังก์ชั่นของรางวัลหรือไม่ มีฟังก์ชั่นของรางวัลในรูปแบบอื่น ๆ หรือไม่? ตัวอย่างเช่นรูปแบบพหุนามที่อาจขึ้นอยู่กับรัฐหรือไม่

2
เหตุใดจึงเลือกตัวอักษร Q ในการเรียนรู้ Q
เหตุใดจึงเลือกตัวอักษร Q ในชื่อของ Q-learning ตัวอักษรส่วนใหญ่จะถูกเลือกเป็นตัวย่อเช่นหมายถึงนโยบายและหมายถึงคุณค่า แต่ฉันไม่คิดว่า Q เป็นคำย่อของคำใด ๆππ\pivvv

1
การเรียนรู้แบบมีผู้สอนเป็นส่วนหนึ่งของการเรียนรู้เสริมหรือไม่?
ดูเหมือนว่าคำจำกัดความของการเรียนรู้แบบมีผู้เรียนเป็นส่วนหนึ่งของการเรียนรู้การเสริมแรงโดยมีฟังก์ชั่นการให้รางวัลประเภทหนึ่งซึ่งอยู่บนพื้นฐานของข้อมูลที่ติดฉลาก (ตรงข้ามกับข้อมูลอื่น ๆ ในสภาพแวดล้อม) นี่เป็นภาพที่ถูกต้องหรือไม่?

4
สถานการณ์ในชีวิตจริงประเภทใดที่เราสามารถใช้อัลกอริธึมแบบหลายแขนโจรได้?
โจรหลายแขนทำงานได้ดีในสถานการณ์ที่คุณมีทางเลือกและคุณไม่แน่ใจว่าสิ่งใดจะเพิ่มความเป็นอยู่ที่ดีที่สุดของคุณ คุณสามารถใช้อัลกอริทึมสำหรับสถานการณ์ชีวิตจริงบางอย่าง เป็นตัวอย่างการเรียนรู้อาจเป็นสาขาที่ดี: หากเด็กกำลังเรียนรู้ช่างไม้และเขาไม่ดีที่มันอัลกอริทึมจะบอกเขา / เธอว่าเขา / เธออาจต้องดำเนินการต่อไป หากเขา / เธอทำได้ดีอัลกอริทึมจะบอกให้เขา / เธอเรียนรู้ฟิลด์นั้นต่อไป การออกเดทเป็นฟิลด์ที่ดีเช่นกัน: คุณเป็นผู้ชายที่พยายามอย่างมากในการตามหาผู้หญิง อย่างไรก็ตามความพยายามของคุณจะไม่ได้รับการยืนยันอย่างแน่นอน อัลกอริทึมควร "เล็กน้อย" (หรืออย่างยิ่ง) ทำให้คุณขยับเขยื้อนต่อไป สถานการณ์ในชีวิตจริงอื่น ๆ ที่เราสามารถใช้อัลกอริทึมโจรหลายแขนสำหรับ? PS: หากคำถามกว้างเกินไปโปรดแสดงความคิดเห็น หากมีฉันทามติฉันจะลบคำถามของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.