Arka fon
İlkelliği tanımak (yapay) sinir ağları için uygun değil gibi görünüyor. Bununla birlikte, evrensel yaklaşım teoremi , sinir ağlarının herhangi bir sürekli işlevi yaklaştırabildiğini belirtir, bu nedenle özellikle arzu edilen herhangi bir sonlu destekli işlevi temsil etmek mümkün olmalıdır. Öyleyse ilk milyon sayıdaki tüm asalları tanımaya çalışalım.
Daha doğrusu, çünkü bu bir programlama web sitesi, hadi 2 ^ 20 = 1,048,576. Bu eşiğin altındaki primer sayısı 82,025 veya kabaca% 8'dir.
Meydan okuma
Bir sinir ağının ne kadar küçük olduğunu, 20-bit tam sayıların tümünü asal olarak mı yoksa asal olarak mı doğru şekilde sınıflandırdığını bulabilirsiniz?
Bu zorluğun amaçları doğrultusunda, bir sinir ağının büyüklüğü onu temsil etmek için gereken toplam ağırlık ve önyargı sayısıdır.
ayrıntılar
Amaç en aza indirgemek , açık ve net bir sinir ağının boyutunu .
Ağınıza giriş, 0s ve 1s ile veya alternatif olarak -1s ve + 1s ile temsil edilen bir tamsayı için ayrı ayrı bitler içeren bir vektör 20 olacaktır. Bunların sırası, ilk önce en anlamlı bit veya en az anlamlı bit olabilir.
Ağınızın çıktısı tek bir sayı olmalıdır; öyle ki, bazı kesimlerin üzerinde giriş asal olarak kabul edilir ve aynı kesimin altında giriş asal değil olarak kabul edilir. Örneğin, pozitif asal anlamına gelebilir (ve negatif asal değil) veya alternatif olarak 0.5'ten büyük asal olabilir (ve 0.5 den asal değil).
Ağ, tüm 2 ^ 20 = 1,048,576 olası girişlerde% 100 doğru olmalıdır. Yukarıda bahsedildiği gibi, bu aralıkta 82.025 priming olduğuna dikkat edin. (Her zaman "asal değil" çıktısının% 92 kesin olduğunu gösterir.)
Standart sinir ağı terminolojisi açısından, buna muhtemelen uygunluk denir . Başka bir deyişle, amacınız mükemmel astarlara uymak. Kullanılabilecek diğer bir deyişle "eğitim seti" ve "test seti" aynıdır.
Bu zorluk "eğitilebilir" veya "öğrenilebilir" parametrelerin sayısını dikkate almaz. Gerçekten de, ağınızın kodlanmış ağırlıklar içermesi muhtemeldir ve aşağıdaki örnek tamamen kodlanmıştır. Bunun yerine, tüm ağırlıklar ve önyargılar parametreler olarak kabul edilir ve sayılır.
Sinir ağınızı eğitmek veya oluşturmak için gereken kodun uzunluğu puanınızla ilgili değildir, ancak ilgili kodu göndermek kesinlikle takdir edilir.
Temel
Temel olarak, toplam 82.025 primi 1.804.551 toplam ağırlık ve önyargı ile "ezberlemek" mümkündür .
Aşağıdaki kodun bir çok şeyi içerdiğine dikkat edin: bir çalışma örneği, çalışma testi kodu, bilinen bir sinir ağı kitaplığı kullanan bir sinir ağı çalışma tanımı, "sabit kodlanmış" (veya en azından "eğitimli" olmayan) sinir ağı, ve çalışan bir skor ölçümü.
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."
Bir sinir ağı nedir?
Bu zorluğun amaçları doğrultusunda, (yapay) bir sinir ağının dar fakat kesin bir tanımını yazabiliriz. Bazı dış okumalar için Vikipedi'yi yapay sinir ağları , feedforward sinir ağları , çok katmanlı algılayıcı ve etkinleştirme işlevi hakkında öneriyorum .
Bir ileri beslemeli sinir ağı topluluğudur katmanları nöronların. Katman başına nöron sayısı, girdi katmanında 20 nöron, bir veya daha fazla gizli katmandaki bazı nöronlar ve çıkış katmanında 1 nöronla değişmektedir. (En az bir gizli katman olması gerekir, çünkü primerler ve primerler değil bit modellerine göre doğrusal olarak ayrılmazlar.) Yukarıdaki temel örnekte, katmanların boyutları [20, 82025, 1].
Giriş nöronlarının değerleri girdi tarafından belirlenir. Yukarıda tarif edildiği gibi, bu, 0 ila 2 ^ 20 arasında bir sayının bitlerine karşılık gelen 0s ve 1s veya benzer şekilde -1s ve + 1s olacaktır.
Çıkış katmanı da dahil olmak üzere her bir katmanın nöronlarının değerleri önceden kattan belirlenir. İlk önce, tamamen bağlı veya yoğun bir şekilde doğrusal bir işlev uygulanır . Böyle bir işlevi temsil etmenin bir yöntemi bir ağırlık matrisi kullanmaktır. Örneğin, taban çizgisinin ilk iki katı arasındaki geçişler 82025 x 20 matris ile gösterilebilir. Ağırlıkların sayısı, bu matristeki, örneğin 1640500'deki girdilerin sayısıdır. Daha sonra, her girişin eklenmiş (ayrı) bir önyargı terimi vardır. Bu bir vektörle gösterilebilir, örneğin bizim durumumuzda 82025 x 1 matris. Önyargı sayısı giriş sayısıdır, örneğin 82025. (Ağırlıklar ve önyargıların birlikte bir afin doğrusal işlevi tanımladığını unutmayın .)
Bir ağırlık veya yanlılık sıfır olsa bile sayılır. Bu dar tanımın amaçları açısından, önyargılar sıfır olsa bile ağırlık olarak sayılır. Temel örnekte, yalnızca iki farklı ağırlığın (+1 ve -1) kullanıldığını (ve sadece biraz daha belirgin önyargıların) olduğunu unutmayın; Bununla birlikte, büyüklüğü bir milyondan fazladır, çünkü tekrarlama hiçbir şekilde skor ile yardımcı olmuyor.
Son olarak, etkinleştirme işlevi adı verilen doğrusal olmayan bir işlev , bu afin doğrusal işlevinin sonucuna giriş olarak uygulanır. Bu dar tanımın amaçları için, evcil aktivasyon fonksiyonları relu , tanh ve sigmoid . Tüm katman aynı etkinleştirme işlevini kullanmalıdır.
Temel örnekte, ağırlık sayısı 20 * 82025 + 82025 * 1 = 1722525 ve önyargı sayısı 82025 + 1 = 82026, toplam 1722525 + 82026 = 1804551'dir. Sembolik bir örnek olarak, eğer varsa bir kat daha ve kat boyutları bunun yerine [20, a, b, 1], daha sonra ağırlık sayısı 20 x a + a * b + b * 1 olur ve önyargı sayısı bir + b + 1 olur.
Sinir ağının Bu tanım dahil birçok çerçeveler tarafından iyi desteklenir keras , scikit-öğrenme ve Tensorflow . Keras, yukarıdaki temel örnekte, esasen aşağıdaki gibi kod kullanılarak kullanılır:
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)
Ağırlıklar ve önyargı matrisleri numpy dizileri ise, numpy.size size doğrudan giriş sayısını söyleyecektir.
Başka tür sinir ağları var mı?
Sinir ağının tek, kesin bir tanımını yapmak ve bu zorluğun amaçları için puan almak istiyorsanız, lütfen önceki bölümdeki tanımı kullanın. “Herhangi bir fonksiyonun” doğru yola baktığını ve parametrelerinin olmadığı bir sinir ağı olduğunu düşünüyorsanız, lütfen önceki bölümdeki tanımı kullanın.
Daha özgür bir ruhsan, daha fazlasını keşfetmeni tavsiye ederim. Belki de cevabınız dar zorluklara katılmaz, ama belki daha çok eğlenirsiniz. Deneyebileceğiniz diğer fikirler arasında daha fazla egzotik aktivasyon işlevi, tekrarlayan sinir ağları (her seferinde bir bit okuyarak), evrişimli sinir ağları, daha egzotik mimariler, softmax ve LSTM'ler (!) Bulunur. Herhangi bir standart etkinleştirme işlevini ve herhangi bir standart mimariyi kullanabilirsiniz. "Standart" sinir ağı özelliklerinin serbestçe tanımlanması, bu sorunun gönderilmesinden önce arşivde yayınlanan her şeyi içerebilir.