পটভূমি
প্রাথমিকতা সনাক্তকরণ (কৃত্রিম) নিউরাল নেটওয়ার্কগুলির জন্য একটি দুর্বল ফিট বলে মনে হচ্ছে। তবে সর্বজনীন আনুমানিক উপপাদ্যটি বলে যে নিউরাল নেটওয়ার্কগুলি যে কোনও ধ্রুবক ফাংশন আনুমানিক করতে পারে, তাই বিশেষত যে কোনও চূড়ান্ত-সমর্থিত ফাংশনকে একটি আকাঙ্ক্ষাকে উপস্থাপন করা সম্ভব হওয়া উচিত। সুতরাং আসুন প্রথম মিলিয়ন সংখ্যার মধ্যে সমস্ত প্রাইমকে সনাক্ত করার চেষ্টা করি।
আরও স্পষ্টভাবে, কারণ এটি একটি প্রোগ্রামিং ওয়েবসাইট, আসুন 2 ^ 20 = 1,048,576 এ যান। এই প্রান্তিকের নীচে প্রাইমের সংখ্যা 82,025 বা মোটামুটি 8%।
চ্যালেঞ্জ
নিউরাল নেটওয়ার্কের মধ্যে আপনি কতটা ছোট খুঁজে পেতে পারেন যে সমস্ত 20-বিট পূর্ণসংখ্যাকে সঠিকভাবে প্রধান হিসাবে বা প্রধান হিসাবে শ্রেণিবদ্ধ করে?
এই চ্যালেঞ্জের উদ্দেশ্যে, নিউরাল নেটওয়ার্কের আকার হ'ল এটি উপস্থাপনের জন্য প্রয়োজনীয় মোট ওজন এবং বায়াসগুলির সংখ্যা।
বিস্তারিত
লক্ষ্যটি হ'ল একক, সুস্পষ্ট নিউরাল নেটওয়ার্কের আকার হ্রাস করা ।
আপনার নেটওয়ার্কের ইনপুটটি দৈর্ঘ্যের 20 এর ভেক্টর হবে যা কোনও পূর্ণসংখ্যার পৃথক বিট যুক্ত 0 বা 1s বা বিকল্পভাবে -1 এবং + 1 এর সাথে উপস্থাপিত হয়। এর ক্রমটি সবচেয়ে গুরুত্বপূর্ণ-বিট প্রথম বা সর্বনিম্ন-তাত্পর্যপূর্ণ-বিট প্রথম হতে পারে।
আপনার নেটওয়ার্কের আউটপুটটি একক সংখ্যা হওয়া উচিত, যেমন কিছু কাটফের উপরে ইনপুটটি প্রাইম হিসাবে স্বীকৃত হয় এবং একই কাটঅফের নীচে ইনপুটটি প্রাইম নয় হিসাবে স্বীকৃত হয়। উদাহরণস্বরূপ, ধনাত্মকটির অর্থ প্রধান (এবং নেতিবাচক প্রাইম নয়) হতে পারে, বা বিকল্পটি 0.5 এর চেয়ে বেশি হতে পারে প্রধান (এবং 0.5 এর চেয়ে কম প্রধানমন্ত্রী নয়)।
নেটওয়ার্কটি সমস্ত 2 ^ 20 = 1,048,576 সম্ভাব্য ইনপুটগুলিতে অবশ্যই 100% নির্ভুল হতে হবে। উপরে উল্লিখিত হিসাবে, নোট করুন যে এই ব্যাপ্তিতে 82,025 টি প্রাইম রয়েছে। (এটি অনুসরণ করে যে সর্বদা "প্রাইম নয়" আউটপুটিং 92% সঠিক হবে))
স্ট্যান্ডার্ড নিউরাল নেটওয়ার্ক পরিভাষার ক্ষেত্রে, এটি সম্ভবত ওভারফিটিং বলা হবে । অন্য কথায়, আপনার লক্ষ্যটি প্রাইমগুলিকে পুরোপুরি মানিয়ে নেওয়া। অন্য যে কোনও শব্দ ব্যবহার করতে পারে তা হ'ল "প্রশিক্ষণ সেট" এবং "পরীক্ষার সেট" একই are
এই চ্যালেঞ্জটি "প্রশিক্ষণযোগ্য" বা "শেখার যোগ্য" পরামিতিগুলির সংখ্যা বিবেচনা করে না। প্রকৃতপক্ষে, আপনার নেটওয়ার্কটিতে হার্ড-কোডিং ওজন থাকতে পারে এবং নীচের উদাহরণটি পুরোপুরি হার্ড-কোডড। পরিবর্তে, সমস্ত ওজন এবং পক্ষপাত বিবেচনা করা হয় এবং গণনা করা হয়।
আপনার নিউরাল নেটওয়ার্ক প্রশিক্ষণ বা জেনারেট করার জন্য প্রয়োজনীয় কোডের দৈর্ঘ্যটি আপনার স্কোরের সাথে প্রাসঙ্গিক নয় তবে প্রাসঙ্গিক কোড পোস্ট করা অবশ্যই প্রশংসিত হয়।
বেসলাইন
বেসলাইন হিসাবে, 1,804,551 মোট ওজন এবং বায়াস সহ সমস্ত 82,025 টি প্রাইমকে "মুখস্থ" করা সম্ভব ।
নোট করুন যে এর পরে এই কোডটিতে অনেকগুলি বিষয় রয়েছে: একটি কার্যকারী উদাহরণ, ওয়ার্কিং টেস্ট কোড, পরিচিত নিউরাল লাইব্রেরি ব্যবহার করে নিউরাল নেটওয়ার্কের একটি কার্যকরী সংজ্ঞা, একটি "হার্ড-কোডড" (বা কমপক্ষে, "প্রশিক্ষিত নয়") নিউরাল নেটওয়ার্ক, এবং স্কোর একটি কাজের পরিমাপ।
import numpy as np
bits = 20
from keras.models import Sequential
from keras.layers import Dense
from sympy import isprime
# Hardcode some weights
weights = []
biases = []
for n in xrange(1<<bits):
if not isprime(n):
continue
bit_list = [(n / (1 << i))%2 for i in xrange(bits)]
weight = [2*bit - 1 for bit in bit_list]
bias = - (sum(bit_list) - 1)
weights.append(weight)
biases .append(bias)
nprimes = len(biases)
weights1 = np.transpose(np.array(weights))
biases1 = np.array(biases )
weights2 = np.full( (nprimes,1), 1 )
biases2 = np.array( [0] )
model = Sequential()
model.add(Dense(units=nprimes, activation='relu', input_dim=bits, weights=[weights1, biases1]))
model.add(Dense(units=1, activation='relu', weights=[weights2, biases2]))
print "Total weights and biases: {}".format( np.size(weights1) + np.size(weights2) + np.size(biases1) + np.size(biases2) )
# Evaluate performance
x = []
y = []
for n in xrange(1<<bits):
row = [(n / (1 << i))%2 for i in xrange(bits)]
x.append( row )
col = 0
if isprime(n):
col = 1
y.append( col )
x = np.array(x)
y = np.array(y)
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])
loss, accuracy = model.evaluate(x, y, batch_size=256)
if accuracy == 1.0:
print "Perfect fit."
else:
print "Made at least one mistake."
নিউরাল নেটওয়ার্ক কী?
এই চ্যালেঞ্জের উদ্দেশ্যে, আমরা একটি (কৃত্রিম) নিউরাল নেটওয়ার্কের সংকীর্ণ তবে সুনির্দিষ্ট সংজ্ঞাটি লিখতে পারি। কিছু বাহ্যিক পাঠের জন্য, আমি কৃত্রিম নিউরাল নেটওয়ার্ক , ফিডফোরওয়ার্ড নিউরাল নেটওয়ার্ক , মাল্টিলেয়ার পারসেপ্ট্রন এবং অ্যাক্টিভেশন ফাংশন সম্পর্কিত উইকিপিডিয়াকে পরামর্শ দিই ।
একটি ফিডফোরওয়ার্ড নিউরাল নেটওয়ার্ক হল নিউরনের স্তরগুলির সংগ্রহ । ইনপুট লেয়ারে 20 টি নিউরন, এক বা একাধিক লুকানো স্তরগুলিতে কিছু সংখ্যক নিউরন এবং আউটপুট স্তরে 1 নিউরনের সাথে লেয়ার প্রতি নিউরনের সংখ্যা পরিবর্তিত হয়। (কমপক্ষে একটি লুকানো স্তর থাকা আবশ্যক কারণ প্রাইমগুলি এবং নন-প্রাইমগুলি তাদের বিট নিদর্শন অনুসারে রৈখিকভাবে পৃথক নয়)) উপরের বেসলাইন উদাহরণে স্তরগুলির মাপ [20, 82025, 1]]
ইনপুট নিউরনের মানগুলি ইনপুট দ্বারা নির্ধারিত হয়। উপরে বর্ণিত হিসাবে এটি হয় 0 এবং 2 ^ 20 এর মধ্যে কোনও সংখ্যার বিটের সাথে একইভাবে 0 এবং 1 গুলি হবে, বা -1 এবং 1+ একইভাবে হবে।
আউটপুট স্তর সহ প্রতিটি নীচের নিউরনের মানগুলি স্তর থেকে আগে থেকেই নির্ধারিত হয়। প্রথমে সম্পূর্ণরূপে সংযুক্ত বা ঘন ফ্যাশনে একটি লিনিয়ার ফাংশন প্রয়োগ করা হয় । এই জাতীয় ফাংশন উপস্থাপনের একটি পদ্ধতি হ'ল ওয়েট ম্যাট্রিক্স ব্যবহার করা । উদাহরণস্বরূপ, বেসলাইনের প্রথম দুটি স্তরের মধ্যে স্থানান্তরগুলি 82025 x 20 ম্যাট্রিক্সের সাথে প্রতিনিধিত্ব করা যেতে পারে। ওজনের সংখ্যা হ'ল এই ম্যাট্রিক্সে প্রবেশের সংখ্যা, যেমন 1640500 Then এটি কোনও ভেক্টর দ্বারা প্রতিনিধিত্ব করা যেতে পারে, যেমন আমাদের ক্ষেত্রে একটি 82025 x 1 ম্যাট্রিক্স। গোঁড়ামির সংখ্যা এন্ট্রির সংখ্যা, উদাঃ 82025. হয় (নোট যে ওজন এবং একসঙ্গে গোঁড়ামির একটি বর্ণনা ফাংশন রৈখিক অ্যাফিন ।)
শূন্য হলেও একটি ওজন বা পক্ষপাত গণনা করা হয়। এই সংকীর্ণ সংজ্ঞাটির উদ্দেশ্যে, পক্ষপাতিত্বগুলি সমস্ত শূন্য হলেও এমনকি ওজন হিসাবে গণনা করে। নোট করুন যে বেসলাইন উদাহরণে, শুধুমাত্র দুটি স্বতন্ত্র ওজন (+1 এবং -1) ব্যবহৃত হয় (এবং কেবল কিছুটা আলাদা স্বতন্ত্র পক্ষপাত); তবুও, আকারটি এক মিলিয়নেরও বেশি, কারণ পুনরাবৃত্তি কোনওভাবেই স্কোরকে সহায়তা করে না।
অবশেষে, অ্যাক্টিভেশন ফাংশন নামক একটি ননলাইনার ফাংশন এই এফাইন লিনিয়ার ফাংশনের ফলাফলের জন্য প্রবেশ অনুসারে প্রয়োগ করা হয়। এই সংকীর্ণ সংজ্ঞাটির উদ্দেশ্যে, অনুমোদিত অ্যাক্টিভেশন ফাংশনগুলি হ'ল রিলু , তানহ এবং সিগময়েড । পুরো স্তরটিকে একই অ্যাক্টিভেশন ফাংশনটি ব্যবহার করতে হবে।
বেসলাইন উদাহরণে, ওজনের সংখ্যা 20 * 82025 + 82025 * 1 = 1722525 এবং পক্ষপাতের সংখ্যা 82025 + 1 = 82026, মোট স্কোরের জন্য 1722525 + 82026 = 1804551. একটি প্রতীকী উদাহরণ হিসাবে, যদি সেখানে থাকত এর পরিবর্তে আরও একটি স্তর এবং স্তর আকার ছিল [20, a, b, 1], তারপরে ওজনের সংখ্যা 20 * a + a * b + b * 1 হবে এবং পক্ষপাতের সংখ্যাটি একটি + বি + 1 হবে।
নিউরাল নেটওয়ার্কের এই সংজ্ঞা কেরাস , সাইকিট-লার্ন , এবং টেনসরফ্লো সহ অনেকগুলি ফ্রেমওয়ার্ক দ্বারা ভাল-সমর্থনযোগ্য । উপরের বেসলাইন উদাহরণে কেরাস ব্যবহার করা হয়েছে, মূলত কোড সহ নিম্নরূপ:
from keras.models import Sequential
model = Sequential()
from keras.layers import Dense
model.add(Dense(units=82025, activation='relu', input_dim=20, weights=[weights1, biases1]))
model.add(Dense(units=1, activation='relu', weights=[weights2, biases2]))
score = numpy.size(weights1) + numpy.size(biases1) + numpy.size(weights2) + numpy.size(biases2)
যদি ওজন এবং বায়াস ম্যাট্রিকগুলি নমপি অ্যারে হয়, তবে numpy.size আপনাকে সরাসরি এন্ট্রিগুলির সংখ্যা বলবে।
অন্যান্য ধরণের নিউরাল নেটওয়ার্ক রয়েছে কি?
আপনি যদি এই চ্যালেঞ্জের উদ্দেশ্যে নিউরাল নেটওয়ার্ক এবং স্কোরের একক, সুনির্দিষ্ট সংজ্ঞা চান, তবে দয়া করে পূর্ববর্তী বিভাগে সংজ্ঞাটি ব্যবহার করুন। আপনি যদি মনে করেন যে "যে কোনও ফাংশন" সঠিকভাবে দেখেছে এটি একটি নিউরাল নেটওয়ার্ক যার কোনও পরামিতি নেই , তবে দয়া করে পূর্ববর্তী বিভাগে সংজ্ঞাটি ব্যবহার করুন।
আপনি যদি আরও মুক্ত আত্মা হন তবে আমি আপনাকে আরও অনুসন্ধান করতে উত্সাহিত করি। সম্ভবত আপনার উত্তর সংকীর্ণ চ্যালেঞ্জের দিকে গণনা করবে না তবে আপনি আরও মজা পাবেন। আপনি চেষ্টা করতে পারেন এমন কিছু অন্যান্য ধারণাগুলির মধ্যে আরও বহিরাগত অ্যাক্টিভেশন ফাংশন, পুনরাবৃত্ত নিউরাল নেটওয়ার্কগুলি (একবারে কিছুটা পড়া), কনভোলশনাল নিউরাল নেটওয়ার্কগুলি, আরও বহিরাগত আর্কিটেকচার, সফটম্যাক্স এবং এলএসটিএম (!) অন্তর্ভুক্ত রয়েছে। আপনি কোনও মানক অ্যাক্টিভেশন ফাংশন এবং কোনও মানক আর্কিটেকচার ব্যবহার করতে পারেন। "স্ট্যান্ডার্ড" স্নায়বিক নেটওয়ার্ক বৈশিষ্ট্যগুলির একটি উদার সংজ্ঞা এই প্রশ্নটি পোস্ট করার আগে আর্ক্সিভে পোস্ট করা কিছু অন্তর্ভুক্ত করতে পারে।