1x1 convolution หมายถึงอะไรในเครือข่ายประสาทเทียม


106

ขณะนี้ฉันกำลังสอน Udacity Deep Learning ในบทที่ 3 พวกเขาพูดถึงการโน้มน้าวใจ 1x1 การแปลง 1x1 นี้ใช้ในโมดูลการเริ่มต้นของ Google ฉันมีปัญหาในการทำความเข้าใจว่าอะไรคือการโน้มน้าวใจ 1x1

ฉันได้เห็นโพสต์นี้โดย Yann Lecun ด้วย

ใครช่วยอธิบายเรื่องนี้ให้ฉันหน่อยได้ไหม



1
นี่คือการโพสต์บล็อกของโมดูลเหล่านี้ซึ่งมีรายละเอียดเกี่ยวกับการโน้มน้าวใจ 1x1: hackathonprojects.wordpress.com/2016/09/25/…
Tommy

1
ความคิดทั้งหมดคือการลดจำนวนช่องสัญญาณในระดับเสียง 3 มิติจึงทำให้การคำนวณเร็วขึ้น
onerhao

คำตอบ:


113

สมมติว่าฉันมีเลเยอร์ Conv ซึ่งแสดงเทนเซอร์ที่มีรูปร่างที่:(N,F,H,W)

  • Nคือขนาดแบทช์
  • Fคือจำนวนตัวกรอง convolutional
  • H,Wเป็นมิติเชิงพื้นที่

สมมติว่าผลลัพธ์นี้จะถูกป้อนเข้าชั้นแปลงที่มีฟิลเตอร์ 1x1, ศูนย์ padding และกางเกง 1 แล้วการส่งออกของชั้น 1x1 แปลงนี้จะมีรูปร่างW)F1(N,F1,H,W)

ดังนั้นตัวกรอง Conv 1x1 สามารถใช้เพื่อเปลี่ยนขนาดในพื้นที่ตัวกรอง ถ้าดังนั้นเรากำลังเพิ่มมิติข้อมูลถ้าเรากำลังลดมิติข้อมูลในมิติตัวกรองF1>FF1<F

อันที่จริงแล้วในบทความ Google Inception Going Deeper with Convolutionsพวกเขากล่าวว่า (ตัวหนาเป็นของฉันไม่ใช่ผู้เขียนต้นฉบับ):

ปัญหาใหญ่อย่างหนึ่งของโมดูลข้างต้นอย่างน้อยก็ในรูปแบบไร้เดียงสานี้ก็คือแม้กระทั่งจำนวน Convolutions 5x5 จำนวนเล็กน้อยอาจมีราคาแพงอยู่บนเลเยอร์ Convolutional ที่มีตัวกรองจำนวนมาก

สิ่งนี้นำไปสู่ความคิดที่สองของสถาปัตยกรรมที่เสนอ: ใช้การลดขนาดและการคาดการณ์อย่างรอบคอบทุกที่ที่ข้อกำหนดในการคำนวณจะเพิ่มขึ้นเป็นอย่างมาก สิ่งนี้ขึ้นอยู่กับความสำเร็จของงานแต่งงาน: แม้แต่งานแต่งที่มีมิติต่ำอาจมีข้อมูลจำนวนมากเกี่ยวกับแพทช์ภาพที่ค่อนข้างใหญ่ ... ใช้การคำนวณ 1x1 เพื่อลดการคำนวณก่อนที่จะมีราคาแพง 3x3 และ 5x5 convolutions นอกเหนือจากการใช้เป็นการลดพวกเขายังรวมถึงการใช้การเปิดใช้งานเชิงเส้นที่แก้ไขซึ่งทำให้พวกเขาแบบ dual- วัตถุประสงค์

ดังนั้นในสถาปัตยกรรม Inception เราใช้ตัวกรอง convolutional 1x1 เพื่อลดมิติในมิติตัวกรอง ดังที่ฉันได้อธิบายไว้ข้างต้นเลเยอร์ Conv 1x1 เหล่านี้สามารถใช้โดยทั่วไปเพื่อเปลี่ยนมิติพื้นที่ตัวกรอง (เพิ่มขึ้นหรือลดลง) และในสถาปัตยกรรม Inception เราเห็นว่าตัวกรอง 1x1 เหล่านี้มีประสิทธิภาพเพียงใดสำหรับการลดขนาดมิติอย่างชัดเจนในพื้นที่มิติตัวกรอง ไม่ใช่พื้นที่มิติเชิงพื้นที่

อาจมีการตีความอื่น ๆ ของตัวกรอง Conv 1x1 แต่ฉันชอบคำอธิบายนี้โดยเฉพาะในบริบทของสถาปัตยกรรม Google Inception


3
นั่นคือ 1x1 conv บีบอัดมิติตัวกรองก่อนหน้านี้เป็น 1 ก่อนที่จะใช้การแปลง 5x5 หรือไม่
Leonard Loo

1
@LeonardLoo แต่ละเคอร์เนล 1x1 ลดขนาดตัวกรองให้เหลือ 1 แต่คุณสามารถมีหลายเมล็ดได้ใน 1x1 Convolution ดังนั้นจำนวนของ "ตัวกรอง" สามารถเลือกได้ตามใจชอบ
Fazzolini

43

การแปลง 1x1 จะทำการแมปพิกเซลอินพุตกับช่องสัญญาณทั้งหมดไปยังพิกเซลเอาต์พุตโดยไม่มองสิ่งรอบตัว มันมักจะใช้เพื่อลดจำนวนช่องทางเชิงลึกเนื่องจากมันมักจะช้ามากที่จะคูณปริมาณที่มีความลึกขนาดใหญ่มาก

input (256 depth) -> 1x1 convolution (64 depth) -> 4x4 convolution (256 depth)

input (256 depth) -> 4x4 convolution (256 depth)

ด้านล่างช้ากว่าประมาณ 3.7x

ในทางทฤษฎีโครงข่ายประสาทเทียมสามารถ 'เลือก' ซึ่ง 'สี' อินพุตเพื่อดูการใช้สิ่งนี้แทนที่จะใช้กำลังดุร้ายทวีคูณทุกอย่าง


19
ฉันจะบอกว่า 1x1 แมปไม่เพียงแค่หนึ่งพิกเซลเพื่อพิกเซลออก แต่มันยุบช่องสัญญาณพิกเซลทั้งหมดเป็นหนึ่งพิกเซล ในตัวอย่างของคุณในบรรทัดแรกมีอินพุต 256 ช่องและเคอร์เนล 64 1x1 แต่ละช่องยุบตัวอินพุต 256 ช่องทั้งหมดเป็น "พิกเซล" หนึ่งช่อง (จำนวนจริง) ผลลัพธ์คือคุณมี 64 ช่องแทนที่จะเป็น 256 ที่มีมิติพิเศษซึ่งทำให้การคำนวณแบบ 4x4 ถูกกว่าในตัวอย่างบรรทัดที่สองของคุณ
Fazzolini

จุดดีจะอัปเดตโพสต์ :)
ฟรี Debreuil

3
คุณทำให้ 3.7x ช้าลงจากที่ไหน
CMCDragonkai

@CMCDragonkai สมมติว่าต้นทุนการคำนวณเป็นสัดส่วนกับจำนวนน้ำหนัก num_weights = in_depth x out_depth x kernel_size = 256x256x4x4ในกรณีที่ต่อมา ในกรณีแรก, num_weights = 256x64x1x1+64x265x4x4=256x64x17. ใช้อัตราส่วนและให้ 256/17 ~ 3.7 ตรวจสอบภาพกระดาษหน้า 9 นี้เพื่อดูภาพว่าน้ำหนักของ NUM เกี่ยวข้องกับความลึกของอินพุตและความลึกของเอาต์พุตอย่างไร arxiv.org/pdf/1603.07285.pdf
Nelson Dinh

11

เหตุผลหลักที่ฉันไม่เข้าใจความเชื่อมั่น 1x1 นั้นเป็นเพราะฉันไม่เข้าใจว่าการโน้มน้าวใจจริง ๆ - ปัจจัยสำคัญคือการคำนวณการทำงานร่วมกันของแชนเนล / ฟิลเตอร์หลายตัว เพื่อทำความเข้าใจนี้ฉันพบว่าคำตอบนี้มีประโยชน์เช่นกัน:any

https://datascience.stackexchange.com/questions/9175/how-do-subsequent-convolution-layers-work

โดยเฉพาะอย่างยิ่ง Type 2.2 เป็นคำอธิบายที่ถูกต้องของการโน้มน้าวใจที่นั่น

คำตอบที่เป็นประโยชน์อื่น:

https://ai.stackexchange.com/questions/5769/in-a-cnn-does-each-new-filter-have-different-weights-for-each-input-channel-or

คำตอบนี้จะอธิบายถึงวิธีการที่คุณมีตัวกรองแยกต่างหากสำหรับแต่ละชุดช่องทางเข้า / ออก หลังจากการคำนวณแต่ละรายการผลลัพธ์จะถูกนำมารวมกับแกนของช่องสัญญาณที่ออกโดยมีค่าของจำนวนช่องสัญญาณออก

ต่อไปนี้เป็นวิดีโอที่ฉันพบซึ่งช่วยให้ฉันเข้าใจว่าการทำงานแบบ 1x1 Convolution ทำงานอย่างไร

https://www.coursera.org/lecture/convolutional-neural-networks/networks-in-networks-and-1x1-convolutions-ZTb8x

นี่คือสิ่งสำคัญที่ฉันได้รับจากมัน:

  • การป้อนข้อมูลไปยังบิด 1x1 มักจะ convolutions ก่อนหน้านี้ที่มีขนาด x nแต่ถ้ามีฟิลเตอร์ในเลเยอร์สุดท้ายของการคุณจะได้เมทริกซ์รูปการแปลง 1x1 เป็นเวกเตอร์ขนาดที่สามารถไปทั่วทั้งภาพได้โดยสร้างตัวกรองเอาต์พุตหนึ่ง xถ้าคุณมี convolutions 1x1 แล้วออกทั้งหมดของ convolutions 1x1 ที่มีขนาดF_2)mnf1(m,n,f1)f1mnf2(m,n,f2)
  • ดังนั้นการ 1x1 โดยสมมติว่าสามารถมองเห็นได้ว่าเป็นการตัวกรองผ่านตัวกรองอีกครั้ง มันช่วยให้เครือข่ายฝึกอบรมวิธีการลดขนาดได้อย่างมีประสิทธิภาพมากที่สุดf2<f1f1f2

ตกลงนี่เป็นสถานที่เดียวที่อธิบายได้อย่างถูกต้องว่า 1x1 convolution เป็นผลิตภัณฑ์ 'dot' ที่มี(m,n,f1)
Red Floyd

3

ฉันจะพยายามอธิบายภาพสังหรณ์ใจและอธิบายสั้น ๆ ให้มากขึ้น!

1 * 1 แปลง (aka เครือข่ายในเครือข่าย )

สมมติว่าคุณป้อนข้อมูลคือ (n_H, n_W, n_c_prev) คุณสามารถนึกได้ว่า (1 * 1 * n_c_prev) เป็นเซลล์ประสาทเดี่ยว (เครือข่ายที่เชื่อมต่ออย่างเต็มที่ - เพราะเหตุใดN / w ใน N / w ) ที่กำลังรับหมายเลข (n_c_prev) ในอินพุตที่คูณด้วย (1 * 1 * n_c_prev ) จากนั้นเพิ่มและจากนั้นรับ ReLu & output (n_H, n_W) และหากคุณมีตัวกรองหลายตัว (n_c) ดังนั้นเอาต์พุตจะเป็น (n_H, n_W, n_C)

ดังนั้นคุณสามารถใช้ pooling layer เพื่อลดขนาดพิเศษ (n_H, n_W) และสามารถใช้ 1 * 1 Conv เพื่อลด n_c_prev (เช่นจำนวนช่อง) ที่ช่วยประหยัดการคำนวณจำนวนมาก ตัวอย่างเช่น

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นการไป

  • คุณสามารถใช้เลเยอร์ convolutional 1x1 เพื่อลด n_C แต่ไม่ใช่ n_H, n_W

  • คุณสามารถใช้เลเยอร์ร่วมกันเพื่อลด n_H, n_W และ n_C

ในคำอื่น ๆ ป้อนคำอธิบายรูปภาพที่นี่

  • คุณกำลังทำอะไรโดยใช้ตัวกรอง CONV 1 * 1 คืออะไร โดยทั่วไปคุณจะใช้ "1 * 1 * num_input_channel_of_featureMap" ขนาดน้ำหนักและสังวัตนา (elementwise * ตามด้วย +) วอลุ่มนี้เหนือรูปภาพ / คุณสมบัติขนาดแผนที่ "W H num_input_channel_of_featureMap" และสิ่งที่คุณได้รับคือขนาดเอาท์พุต "W * H"

  • ตอนนี้คุณสามารถใช้ "#filters" จำนวนเช่น "1 * 1 * num_input_channel_of_featureMap" และรับปริมาณ "W H #filter" เป็นผลลัพธ์สุดท้าย!

  • ยิ่งไปกว่านั้นคุณกำลังคูณ "1 * 1" เช่น 32 น้ำหนักที่แตกต่างกัน (1 * 1 เล่ม) ด้วยหนึ่งชิ้นที่ตำแหน่งเดียวกันในแผนที่คุณลักษณะการป้อนข้อมูลตามด้วย ReLu และได้รับหมายเลขที่สอดคล้องกันเดียวซึ่งสร้างเป็นพิกเซลสีเขียว !

  • 1 * 1 CONV ช่วยลดจำนวนช่องและบันทึกการคำนวณในบางเครือข่าย (INCEPTIONS)!

  • แต่แน่นอนว่าถ้าคุณต้องการรักษาจำนวนช่องให้เหมือนกับแผนที่คุณสมบัติอินพุตเช่นกันสิ่งเดียวที่ CONV 1 * 1 CONV ทำได้ง่ายคือใช้ ReLU Non-linearity กับมันซึ่งทำให้สามารถเรียนรู้ฟังก์ชันที่ซับซ้อนใน NN


1

อีกแนวคิดหนึ่งเกี่ยวกับการลดขนาดในบริบทของตัวกรอง 1x1:

ยกตัวอย่างเลเยอร์ 4096x8x8 fc7 จาก FCN จะเกิดอะไรขึ้นถ้าเลเยอร์ถัดไป (เรียกว่า fc8) คือ 2048x8x8 ที่มีขนาดตัวกรอง 1 fc7 นั้นลึกมากในเครือข่ายแต่ละฟีเจอร์ของ 4096 นั้นมีความหมายเชิงเศรษฐี แต่แต่ละเซลล์ประสาท (เช่นภาพอินพุตคือ 250x250x3) มีเขตข้อมูลที่เปิดกว้างมาก กล่าวอีกนัยหนึ่งถ้าเซลล์ประสาททำงานมากเรารู้ว่ามีบางแห่งในความหมายของมันมีคุณสมบัติที่เกี่ยวข้อง

ยกตัวอย่างเซลล์ประสาทซ้ายสุดบน fc8 พร้อมตัวกรอง 1x1 มันเชื่อมต่อกับ 4096 เซลล์ประสาท / คุณสมบัติเฉพาะในเขตข้อมูลที่เปิดกว้างเดียวกัน (มุมบนซ้ายของภาพ) ซึ่งแต่ละแห่งจะเปิดใช้งานโดยคุณสมบัติเดียว พวกเขาบางคน (500 คนเดียวกัน) มีความกระตือรือร้นมาก หากเซลล์ประสาทที่ได้รับออกมานั้นทำงานมากก็หมายความว่ามันอาจเรียนรู้ที่จะระบุคุณสมบัติ 1 อย่างหรือมากกว่านั้นในฟิลด์ที่เปิดกว้างนี้ หลังจากคุณทำเซลล์ประสาทซ้ายสุดบน 2048 ครั้งใน fc8 แล้วบางส่วนของพวกมัน (เช่น 250) จะทำงานมากซึ่งหมายความว่าพวกเขา 'รวบรวม' คุณสมบัติจากสนามรับเดียวกันผ่าน fc7 และมีโอกาสมากกว่า หนึ่ง.

หากคุณลดขนาดลงเรื่อย ๆ จำนวนเซลล์ประสาทที่ลดลงจะได้เรียนรู้คุณลักษณะที่เพิ่มขึ้นจากเขตข้อมูลเดียวกัน และเนื่องจากพารามิเตอร์เชิงพื้นที่ 8x8 ยังคงเหมือนเดิมเราจะไม่เปลี่ยน 'มุมมอง' ของแต่ละเซลล์ประสาทดังนั้นจึงไม่ลดความหยาบของอวกาศ

คุณอาจต้องการดู 'เครือข่ายเต็มรูปแบบ Convolutional' โดย Long, Shelhamer และ Darrel


1
ฉันคิดว่านี่เป็นอีกสัญชาติญาณที่ดีของกลไก แต่ฉันจะต้องกลับมาหามันเพราะฉันพบว่าสัญกรณ์สำหรับมิติที่สับสนและโดยเฉพาะอย่างยิ่ง "หลังจากที่คุณทำสิ่งนี้ไปแล้ว 2048 ครั้งสำหรับซ้าย - บนสุด เซลล์ประสาทใน fc8 "
WillC

ฉันไม่เข้าใจสิ่งที่คุณพยายามจะพูดได้ดีคุณช่วยอธิบายให้ชัดเจนขึ้นได้ไหม?
Michael Heidelberg

0

การดำเนินการทางคณิตศาสตร์ของการบิดหมายถึงการคำนวณผลิตภัณฑ์ของฟังก์ชันทั้งสอง (ต่อเนื่องหรือไม่ต่อเนื่อง) เหนือตำแหน่งการเลื่อนที่เป็นไปได้ทั้งหมด

ในรูปภาพ 2 มิติ (ระดับสีเทา) การดำเนินการด้วยการดำเนินการโดยการเลื่อน - หน้าต่างบานเลื่อนที่หน้าต่าง (2-d convolution kernel) คือ matrixv×v

แอพพลิเคชั่นประมวลผลภาพของเครือข่ายประสาทเทียม - รวมถึงเครือข่ายประสาทเทียม - ได้รับการตรวจสอบใน: [M. Egmont-Petersen, D. de Ridder, H. Handels การประมวลผลภาพด้วยโครงข่ายประสาทเทียม - การตรวจสอบ , การจดจำรูปแบบ , อัตรา 35, No. 10, pp. 2279-2301, 2002]

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