Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Một vài tháng trước, đồng nghiệp của chúng tôi ở Google dành ra trên Kaggle một cuộc thi nhằm tạo ra một công cụ phân loại cho những hình ảnh thu được ở dạng giật gân trò chơi "Nhanh lên, vẽ!" Đội, bao gồm nhà phát triển Yandex Roman Vlasov, đã giành vị trí thứ tư trong cuộc thi. Tại khóa đào tạo học máy vào tháng XNUMX, Roman đã chia sẻ ý tưởng của nhóm mình, cách triển khai cuối cùng của bộ phân loại và các phương pháp thực hành thú vị của đối thủ.


- Chào mọi người! Tên tôi là Roma Vlasov, hôm nay tôi sẽ kể cho các bạn nghe về Quick, Draw! Thử thách nhận dạng Doodle.

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Có năm người trong đội của chúng tôi. Tôi đã tham gia ngay trước thời hạn hợp nhất. Chúng tôi không may mắn, chúng tôi bị lung lay một chút, nhưng chúng tôi bị lung lay từ vị thế tiền bạc, còn họ thì bị lung lay khỏi vị thế vàng. Và chúng tôi đã giành được vị trí thứ tư danh dự.

(Trong suốt cuộc thi, các đội tự quan sát mình trong một xếp hạng được hình thành dựa trên kết quả hiển thị trên một phần của tập dữ liệu được đề xuất. Đến lượt xếp hạng cuối cùng được hình thành trên một phần khác của tập dữ liệu. Điều này được thực hiện như vậy rằng những người tham gia cuộc thi không điều chỉnh thuật toán của họ theo dữ liệu cụ thể.Do đó, trong trận chung kết, khi chuyển đổi giữa các xếp hạng, các vị trí sẽ rung lên một chút (từ tiếng Anh shake up - để trộn): trên dữ liệu khác, kết quả có thể xuất hiện thì khác. Đội của Roman đứng đầu trong top XNUMX. Trong trường hợp này, top XNUMX là tiền, khu vực xếp hạng tiền tệ, vì chỉ có XNUMX vị trí đầu tiên được trao giải thưởng tiền mặt. Sau khi thay đổi, đội đã ở trong vị trí thứ tư. Tương tự, đội kia đánh mất chiến thắng, vị trí vàng. - Ed.)

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Cuộc thi cũng có ý nghĩa quan trọng ở chỗ Evgeniy Babakhnin nhận được đại kiện tướng, Ivan Sosin nhận được kiện tướng, Roman Soloviev vẫn là kiện tướng, Alex Parinov nhận được kiện tướng, tôi đã trở thành chuyên gia, và bây giờ tôi đã là kiện tướng.

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Đây là cái gì, vẽ nhanh? Đây là một dịch vụ của Google. Google có mục tiêu phổ biến AI và với dịch vụ này muốn cho thấy mạng lưới thần kinh hoạt động như thế nào. Bạn đến đó, nhấp vào Hãy vẽ và một trang mới bật lên nơi bạn được yêu cầu: vẽ một đường ngoằn ngoèo, bạn có 20 giây để làm điều này. Bạn đang cố gắng vẽ một đường zigzag trong 20 giây, chẳng hạn như ở đây. Nếu bạn thành công, mạng sẽ nói rằng đó là một đường ngoằn ngoèo và bạn tiếp tục. Chỉ có sáu hình ảnh như vậy.

Nếu mạng của Google không nhận ra được những gì bạn đã vẽ thì tác vụ sẽ bị đánh dấu chéo. Sau này tôi sẽ cho bạn biết điều đó sẽ có ý nghĩa gì trong tương lai dù một bức vẽ có được mạng nhận ra hay không.

Dịch vụ này quy tụ một lượng người dùng khá lớn và tất cả những bức tranh mà người dùng vẽ đều được ghi lại.

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Chúng tôi đã thu thập được gần 50 triệu hình ảnh. Từ đó, ngày tập luyện và kiểm tra cho cuộc thi của chúng tôi đã được hình thành. Nhân tiện, lượng dữ liệu trong bài kiểm tra và số lớp được tô đậm là có lý do. Tôi sẽ kể cho bạn nghe về họ sau.

Định dạng dữ liệu như sau. Đây không chỉ là hình ảnh RGB mà nói một cách đại khái là nhật ký về mọi thứ người dùng đã làm. Word là mục tiêu của chúng tôi, mã quốc gia là quê hương của tác giả bức vẽ nguệch ngoạc, dấu thời gian là thời gian. Nhãn được nhận dạng chỉ cho biết mạng có nhận ra hình ảnh từ Google hay không. Và bản thân bản vẽ là một chuỗi, một đường cong gần đúng mà người dùng vẽ bằng các điểm. Và thời gian. Đây là thời gian kể từ khi bắt đầu vẽ bức tranh.

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Dữ liệu được trình bày ở hai định dạng. Đây là định dạng đầu tiên và định dạng thứ hai được đơn giản hóa. Họ cắt bỏ thời gian từ đó và tính gần đúng tập hợp điểm này với tập hợp điểm nhỏ hơn. Để làm điều này họ đã sử dụng Thuật toán Douglas-Pecker. Bạn có một tập hợp lớn các điểm chỉ xấp xỉ một đường thẳng, nhưng trên thực tế, bạn có thể ước chừng đường này chỉ với hai điểm. Đây là ý tưởng của thuật toán.

Dữ liệu được phân phối như sau. Mọi thứ đều giống nhau, nhưng có một số ngoại lệ. Khi chúng tôi giải quyết vấn đề, chúng tôi đã không nhìn vào nó. Điều chính là không có lớp nào thực sự ít, chúng tôi không phải thực hiện lấy mẫu có trọng số và lấy mẫu quá mức dữ liệu.

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Những bức ảnh trông như thế nào? Đây là lớp "máy bay" và các ví dụ từ nó với các nhãn được nhận dạng và không được nhận dạng. Tỷ lệ của chúng nằm trong khoảng từ 1 đến 9. Như bạn có thể thấy, dữ liệu khá nhiễu. Tôi đoán đó là một chiếc máy bay. Nếu bạn nhìn vào không được nhận dạng, trong hầu hết các trường hợp, đó chỉ là tiếng ồn. Thậm chí có người còn cố viết từ “máy bay” nhưng có vẻ như bằng tiếng Pháp.

Hầu hết những người tham gia chỉ đơn giản lấy lưới, vẽ dữ liệu từ chuỗi đường này dưới dạng hình ảnh RGB và ném chúng vào mạng. Tôi vẽ theo cách tương tự: Tôi lấy một bảng màu, vẽ dòng đầu tiên bằng một màu, ở đầu bảng này, dòng cuối cùng với một màu khác, ở cuối bảng màu, và giữa chúng Tôi đã nội suy mọi nơi bằng cách sử dụng bảng màu này. Nhân tiện, điều này mang lại kết quả tốt hơn so với việc bạn vẽ như trên slide đầu tiên - chỉ bằng màu đen.

Các thành viên khác trong nhóm, chẳng hạn như Ivan Sosin, đã thử các cách tiếp cận vẽ hơi khác nhau. Với một kênh, anh ấy chỉ vẽ một bức tranh màu xám, với một kênh khác, anh ấy vẽ từng nét với độ dốc từ đầu đến cuối, từ 32 đến 255, và với kênh thứ ba, anh ấy vẽ một độ dốc trên tất cả các nét từ 32 đến 255.

Một điều thú vị nữa là Alex Parinov đã tải thông tin lên mạng bằng mã quốc gia.

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Số liệu được sử dụng trong cuộc thi là Độ chính xác trung bình trung bình. Bản chất của thước đo này đối với sự cạnh tranh là gì? Bạn có thể đưa ra ba dự đoán và nếu không có dự đoán đúng trong ba dự đoán này thì bạn nhận được 0. Nếu có một dự đoán đúng thì thứ tự của nó sẽ được tính đến. Và kết quả mục tiêu sẽ được tính là 1 chia cho thứ tự dự đoán của bạn. Ví dụ: bạn đã tạo ba dự đoán và dự đoán đúng là dự đoán đầu tiên, sau đó bạn chia 1 cho 1 và nhận được 1. Nếu dự đoán đúng và thứ tự của nó là 2 thì chia 1 cho 2, bạn được 0,5. Vâng, v.v.

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Với quá trình xử lý trước dữ liệu - cách vẽ hình ảnh, v.v. - chúng tôi đã quyết định được một chút. Chúng tôi đã sử dụng kiến ​​trúc nào? Chúng tôi đã cố gắng sử dụng các kiến ​​trúc béo như PNASNet, SENet và các kiến ​​trúc vốn đã cổ điển như SE-Res-NeXt, chúng ngày càng tham gia vào các cuộc cạnh tranh mới. Ngoài ra còn có ResNet và DenseNet.

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Chúng tôi đã dạy điều này như thế nào? Tất cả các mô hình chúng tôi lấy đều được đào tạo trước trên imagenet. Mặc dù có rất nhiều dữ liệu, 50 triệu hình ảnh, tuy nhiên, nếu bạn sử dụng một mạng được huấn luyện trước trên imagenet, nó sẽ cho kết quả tốt hơn so với việc bạn chỉ huấn luyện nó từ đầu.

Chúng tôi đã sử dụng những kỹ thuật giảng dạy nào? Đây là Quá trình ủ ấm bằng khởi động lại ấm áp, mà tôi sẽ nói đến sau. Đây là một kỹ thuật mà tôi sử dụng trong hầu hết các cuộc thi gần đây của mình và với chúng, nó giúp huấn luyện lưới khá tốt, đạt được mức tối thiểu tốt.

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Tiếp theo Giảm tỷ lệ học tập trên cao nguyên. Bạn bắt đầu huấn luyện mạng, đặt ra một tốc độ học nhất định, tiếp tục dạy nó và sự mất mát của bạn dần dần hội tụ về một giá trị nhất định. Bạn kiểm tra điều này, ví dụ, trong mười kỷ nguyên, sự mất mát không hề thay đổi. Bạn giảm tỷ lệ học tập của mình xuống một giá trị nào đó và tiếp tục học tập. Nó lại giảm xuống một chút, hội tụ ở mức tối thiểu nào đó và bạn lại hạ thấp tốc độ học, v.v., cho đến khi mạng của bạn cuối cùng hội tụ.

Tiếp theo là một kỹ thuật thú vị: Không giảm tốc độ học, tăng kích thước lô. Có một bài viết có cùng tên. Khi huấn luyện mạng, bạn không cần phải giảm tốc độ học mà chỉ cần tăng kích thước lô.

Nhân tiện, kỹ thuật này đã được Alex Parinov sử dụng. Anh ấy bắt đầu với một lô bằng 408, và khi mạng của anh ấy đạt đến một mức ổn định nào đó, anh ấy chỉ cần tăng gấp đôi quy mô lô, v.v.

Trên thực tế, tôi không nhớ kích thước lô của anh ấy đạt đến giá trị nào, nhưng điều thú vị là có những nhóm trên Kaggle đã sử dụng kỹ thuật tương tự, kích thước lô của họ là khoảng 10000. Nhân tiện, các khuôn khổ hiện đại dành cho học sâu, chẳng hạn như Ví dụ: PyTorch cho phép bạn thực hiện việc này rất dễ dàng. Bạn tạo lô của mình và gửi lên mạng không phải nguyên vẹn mà chia nó thành nhiều phần sao cho vừa với thẻ video của bạn, tính toán độ dốc và sau khi bạn đã tính toán độ dốc cho toàn bộ lô, hãy cập nhật các trọng lượng.

Nhân tiện, kích thước lô lớn vẫn được đưa vào cuộc thi này vì dữ liệu khá nhiễu và kích thước lô lớn giúp bạn ước chừng độ dốc chính xác hơn.

Việc dán nhãn giả cũng được sử dụng, chủ yếu được sử dụng bởi Roman Soloviev. Anh ấy đã lấy mẫu khoảng một nửa dữ liệu từ thử nghiệm theo từng đợt và huấn luyện lưới theo các đợt đó.

Kích thước của hình ảnh quan trọng, nhưng thực tế là bạn có rất nhiều dữ liệu, bạn cần đào tạo trong thời gian dài và nếu kích thước hình ảnh của bạn khá lớn thì bạn sẽ đào tạo trong một thời gian rất dài. Nhưng điều này không bổ sung nhiều vào chất lượng của bộ phân loại cuối cùng của bạn, do đó, đáng sử dụng một số hình thức đánh đổi. Và chúng tôi chỉ thử những bức ảnh có kích thước không lớn lắm.

Làm thế nào tất cả được học? Đầu tiên, những bức ảnh cỡ nhỏ được chụp, chạy trên đó nhiều kỷ nguyên, việc này chiếm khá nhiều thời gian. Sau đó, những bức ảnh cỡ lớn được đưa ra, mạng được đào tạo, rồi thậm chí nhiều hơn nữa, để không phải đào tạo lại từ đầu và không lãng phí nhiều thời gian.

Giới thiệu về trình tối ưu hóa. Chúng tôi đã sử dụng SGD và Adam. Bằng cách này, bạn có thể có được một mô hình duy nhất có tốc độ 0,941-0,946 trên bảng xếp hạng công khai, khá tốt.

Nếu bạn kết hợp các mô hình theo một cách nào đó, bạn sẽ nhận được khoảng 0,951. Nếu bạn sử dụng thêm một kỹ thuật nữa, bạn sẽ nhận được số điểm cuối cùng là 0,954 trên bảng công khai, giống như chúng tôi đã đạt được. Nhưng nhiều hơn về điều này sau. Tiếp theo tôi sẽ cho bạn biết cách chúng tôi lắp ráp các mô hình và cách chúng tôi đạt được tốc độ cuối cùng như vậy.

Tiếp theo tôi muốn nói về Cosing Ủ với Khởi động lại ấm áp hoặc Giảm dần độ dốc ngẫu nhiên với Khởi động lại ấm áp. Nói một cách đại khái, về nguyên tắc, bạn có thể sử dụng bất kỳ trình tối ưu hóa nào, nhưng vấn đề là: nếu bạn chỉ huấn luyện một mạng và dần dần nó hội tụ đến mức tối thiểu nào đó, thì mọi thứ đều ổn, bạn sẽ có một mạng, nó sẽ mắc một số lỗi nhất định, nhưng bạn có thể huấn luyện nó hơi khác một chút. Bạn sẽ đặt một số tốc độ học tập ban đầu và giảm dần nó theo công thức này. Bạn hạ thấp nó xuống, mạng của bạn đạt đến mức tối thiểu nào đó, sau đó bạn lưu trọng số và lại đặt tốc độ học tập như khi bắt đầu đào tạo, từ đó đi lên đâu đó từ mức tối thiểu này và một lần nữa giảm tốc độ học tập của bạn.

Do đó, bạn có thể truy cập một số mức tối thiểu cùng một lúc, trong đó khoản lỗ của bạn sẽ cộng hoặc trừ như nhau. Nhưng thực tế là các mạng có trọng số này sẽ đưa ra các lỗi khác nhau trong ngày của bạn. Bằng cách lấy trung bình chúng, bạn sẽ nhận được một số giá trị gần đúng và tốc độ của bạn sẽ cao hơn.

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Về cách chúng tôi lắp ráp các mô hình của mình. Khi bắt đầu bài thuyết trình, tôi đã nói hãy chú ý đến lượng dữ liệu trong bài kiểm tra và số lớp. Nếu bạn thêm 1 vào số mục tiêu trong bộ bài kiểm tra và chia cho số lớp, bạn sẽ nhận được số 330, và điều này đã được viết trên diễn đàn - rằng các lớp trong bài kiểm tra là cân bằng. Điều này có thể được sử dụng.

Dựa trên điều này, Roman Soloviev đã đưa ra một số liệu, chúng tôi gọi đó là Điểm Proxy, tương quan khá tốt với bảng xếp hạng. Vấn đề là: bạn đưa ra một dự đoán, lấy 1 dự đoán cao nhất của bạn và đếm số lượng đối tượng cho mỗi lớp. Tiếp theo, trừ 330 từ mỗi giá trị và cộng các giá trị tuyệt đối thu được.

Các giá trị sau đã thu được. Điều này đã giúp chúng tôi không tạo ra một bảng xếp hạng thăm dò mà xác thực cục bộ và chọn các hệ số cho nhóm của chúng tôi.

Với một dàn nhạc, bạn có thể đạt được tốc độ như vậy. Tôi có thể làm gì khác? Giả sử bạn đã sử dụng thông tin rằng các lớp trong bài kiểm tra của bạn được cân bằng.

Sự cân bằng đã khác. Một ví dụ về một trong số họ - cân bằng với những người chiếm vị trí đầu tiên.

Chúng tôi đã làm gì? Việc cân bằng của chúng tôi khá đơn giản, đó là đề xuất của Evgeny Babakhnin. Trước tiên, chúng tôi sắp xếp dự đoán của mình theo top 1 và chọn các ứng viên từ họ - sao cho số lớp không vượt quá 330. Nhưng đối với một số lớp, bạn sẽ có ít hơn 330 dự đoán. Được rồi, chúng ta cũng sắp xếp theo top 2 và top 3 , và chúng tôi cũng sẽ chọn ứng viên.

Sự cân bằng của chúng tôi khác với sự cân bằng ban đầu như thế nào? Họ sử dụng phương pháp lặp đi lặp lại, chọn lớp phổ biến nhất và giảm xác suất của lớp đó xuống một số nhỏ cho đến khi lớp đó không còn phổ biến nhất nữa. Chúng tôi đã học lớp phổ biến nhất tiếp theo. Vì vậy, họ tiếp tục hạ thấp chúng cho đến khi số lượng tất cả các lớp trở nên bằng nhau.

Mọi người đều sử dụng phương pháp cộng hoặc trừ một để đào tạo mạng, nhưng không phải ai cũng sử dụng phương pháp cân bằng. Sử dụng sự cân bằng, bạn có thể biến thành vàng, và nếu may mắn, bạn có thể biến thành tiền.

Làm thế nào để xử lý trước một ngày? Mọi người đều xử lý trước ngày, cộng hoặc trừ, theo cùng một cách - tạo các tính năng thủ công, cố gắng mã hóa thời gian bằng các màu nét khác nhau, v.v. Alexey Nozdrin-Plotnitsky, người chiếm vị trí thứ 8, đã nói về điều này.

Phân loại bản vẽ viết tay. Báo cáo trong Yandex

Anh ấy đã làm nó khác đi. Anh ấy nói rằng tất cả những tính năng thủ công này của bạn không hoạt động, bạn không cần phải làm điều đó, mạng của bạn nên tự học tất cả những điều này. Và thay vào đó, anh ấy nghĩ ra các mô-đun học tập xử lý trước dữ liệu của bạn. Anh ta ném dữ liệu gốc vào chúng mà không cần xử lý trước - tọa độ điểm và thời gian.

Sau đó, anh ấy lấy sự khác biệt dựa trên tọa độ và tính trung bình tất cả dựa trên thời gian. Và anh ấy đã nghĩ ra một ma trận khá dài. Anh ấy đã áp dụng tích chập 1D cho nó nhiều lần để thu được ma trận có kích thước 64xn, trong đó n là tổng số điểm và 64 được tạo để cung cấp ma trận kết quả cho lớp của bất kỳ mạng tích chập nào chấp nhận số lượng kênh - 64. Anh ta thu được một ma trận 64xn, từ đó cần tạo ra một tensor có kích thước nào đó sao cho số kênh bằng 64. Anh ta đã chuẩn hóa tất cả các điểm X, Y trong khoảng từ 0 đến 32 để tạo ra một tensor có kích thước 32x32. Tôi không biết tại sao anh ấy lại muốn 32x32, mọi chuyện cứ diễn ra như vậy. Và tại tọa độ này anh ta đặt một đoạn của ma trận này có kích thước 64xn. Vì vậy, nó vừa kết thúc với một tensor 32x32x64 mà bạn có thể đưa sâu hơn vào mạng nơ-ron tích chập của mình. Đó là tất cả những gì tôi muốn nói.

Nguồn: www.habr.com

Thêm một lời nhận xét