Ouo.io
Ouo.io is one of the fastest growing URL Shortener Service. Its pretty domain name is helpful in generating more clicks than other URL Shortener Services, and so you get a good opportunity for earning more money out of your shortened link. Ouo.io comes with several advanced features as well as customization options.
With Ouo.io you can earn up to $8 per 1000 views. It also counts multiple views from same IP or person. With Ouo.io is becomes easy to earn money using its URL Shortener Service. The minimum payout is $5. Your earnings are automatically credited to your PayPal or Payoneer account on 1st or 15th of the month.- Payout for every 1000 views-$5
- Minimum payout-$5
- Referral commission-20%
- Payout time-1st and 15th date of the month
- Payout options-PayPal and Payza
BIT-URL
It is a new URL shortener website.Its CPM rate is good.You can sign up for free and shorten your URL and that shortener URL can be paste on your websites, blogs or social media networking sites.bit-url.com pays $8.10 for 1000 views.
You can withdraw your amount when it reaches $3.bit-url.com offers 20% commission for your referral link.Payment methods are PayPal, Payza, Payeer, and Flexy etc.- The payout for 1000 views-$8.10
- Minimum payout-$3
- Referral commission-20%
- Payment methods- Paypal, Payza, and Payeer
- Payment time-daily
Linkrex.net
Linkrex.net is one of the new URL shortener sites.You can trust it.It is paying and is a legit site.It offers high CPM rate.You can earn money by sing up to linkrex and shorten your URL link and paste it anywhere.You can paste it in your website or blog.You can paste it into social media networking sites like facebook, twitter or google plus etc.
You will be paid whenever anyone will click on that shorten a link.You can earn more than $15 for 1000 views.You can withdraw your amount when it reaches $5.Another way of earning from this site is to refer other people.You can earn 25% as a referral commission.- The payout for 1000 views-$14
- Minimum payout-$5
- Referral commission-25%
- Payment Options-Paypal,Bitcoin,Skrill and Paytm,etc
- Payment time-daily
Bc.vc
Bc.vc is another great URL Shortener Site. It provides you an opportunity to earn $4 to $10 per 1000 visits on your Shortened URL. The minimum withdrawal is $10, and the payment method used PayPal or Payoneer.
Payments are made automatically on every seven days for earnings higher than $10.00. It also runs a referral system wherein the rate of referral earning is 10%.- The payout for 1000 views-$10
- Minimum payout -$10
- Referral commission-10%
- Payment method -Paypal
- Payment time-daily
Clk.sh
Clk.sh is a newly launched trusted link shortener network, it is a sister site of shrinkearn.com. I like ClkSh because it accepts multiple views from same visitors. If any one searching for Top and best url shortener service then i recommend this url shortener to our users. Clk.sh accepts advertisers and publishers from all over the world. It offers an opportunity to all its publishers to earn money and advertisers will get their targeted audience for cheapest rate. While writing ClkSh was offering up to $8 per 1000 visits and its minimum cpm rate is $1.4. Like Shrinkearn, Shorte.st url shorteners Clk.sh also offers some best features to all its users, including Good customer support, multiple views counting, decent cpm rates, good referral rate, multiple tools, quick payments etc. ClkSh offers 30% referral commission to its publishers. It uses 6 payment methods to all its users.- Payout for 1000 Views: Upto $8
- Minimum Withdrawal: $5
- Referral Commission: 30%
- Payment Methods: PayPal, Payza, Skrill etc.
- Payment Time: Daily
LINK.TL
LINK.TL is one of the best and highest URL shortener website.It pays up to $16 for every 1000 views.You just have to sign up for free.You can earn by shortening your long URL into short and you can paste that URL into your website, blogs or social media networking sites, like facebook, twitter, and google plus etc.
One of the best thing about this site is its referral system.They offer 10% referral commission.You can withdraw your amount when it reaches $5.- Payout for 1000 views-$16
- Minimum payout-$5
- Referral commission-10%
- Payout methods-Paypal, Payza, and Skrill
- Payment time-daily basis
Short.am
Short.am provides a big opportunity for earning money by shortening links. It is a rapidly growing URL Shortening Service. You simply need to sign up and start shrinking links. You can share the shortened links across the web, on your webpage, Twitter, Facebook, and more. Short.am provides detailed statistics and easy-to-use API.
It even provides add-ons and plugins so that you can monetize your WordPress site. The minimum payout is $5 before you will be paid. It pays users via PayPal or Payoneer. It has the best market payout rates, offering unparalleled revenue. Short.am also run a referral program wherein you can earn 20% extra commission for life.Oke.io
Oke.io provides you an opportunity to earn money online by shortening URLs. Oke.io is a very friendly URL Shortener Service as it enables you to earn money by shortening and sharing URLs easily.
Oke.io can pay you anywhere from $5 to $10 for your US, UK, and Canada visitors, whereas for the rest of the world the CPM will not be less than $2. You can sign up by using your email. The minimum payout is $5, and the payment is made via PayPal.- The payout for 1000 views-$7
- Minimum payout-$5
- Referral commission-20%
- Payout options-PayPal, Payza, Bitcoin and Skrill
- Payment time-daily
Cut-win
Cut-win is a new URL shortener website.It is paying at the time and you can trust it.You just have to sign up for an account and then you can shorten your URL and put that URL anywhere.You can paste it into your site, blog or even social media networking sites.It pays high CPM rate.
You can earn $10 for 1000 views.You can earn 22% commission through the referral system.The most important thing is that you can withdraw your amount when it reaches $1.- The payout for 1000 views-$10
- Minimum payout-$1
- Referral commission-22%
- Payment methods-PayPal, Payza, Bitcoin, Skrill, Western Union and Moneygram etc.
- Payment time-daily
Adf.ly
Adf.ly is the oldest and one of the most trusted URL Shortener Service for making money by shrinking your links. Adf.ly provides you an opportunity to earn up to $5 per 1000 views. However, the earnings depend upon the demographics of users who go on to click the shortened link by Adf.ly.
It offers a very comprehensive reporting system for tracking the performance of your each shortened URL. The minimum payout is kept low, and it is $5. It pays on 10th of every month. You can receive your earnings via PayPal, Payza, or AlertPay. Adf.ly also runs a referral program wherein you can earn a flat 20% commission for each referral for a lifetime.Short.pe
Short.pe is one of the most trusted sites from our top 30 highest paying URL shorteners.It pays on time.intrusting thing is that same visitor can click on your shorten link multiple times.You can earn by sign up and shorten your long URL.You just have to paste that URL to somewhere.
You can paste it into your website, blog, or social media networking sites.They offer $5 for every 1000 views.You can also earn 20% referral commission from this site.Their minimum payout amount is only $1.You can withdraw from Paypal, Payza, and Payoneer.- The payout for 1000 views-$5
- Minimum payout-$1
- Referral commission-20% for lifetime
- Payment methods-Paypal, Payza, and Payoneer
- Payment time-on daily basis
Wi.cr
Wi.cr is also one of the 30 highest paying URL sites.You can earn through shortening links.When someone will click on your link.You will be paid.They offer $7 for 1000 views.Minimum payout is $5.
You can earn through its referral program.When someone will open the account through your link you will get 10% commission.Payment option is PayPal.- Payout for 1000 views-$7
- Minimum payout-$5
- Referral commission-10%
- Payout method-Paypal
- Payout time-daily
CPMlink
CPMlink is one of the most legit URL shortener sites.You can sign up for free.It works like other shortener sites.You just have to shorten your link and paste that link into the internet.When someone will click on your link.
You will get some amount of that click.It pays around $5 for every 1000 views.They offer 10% commission as the referral program.You can withdraw your amount when it reaches $5.The payment is then sent to your PayPal, Payza or Skrill account daily after requesting it.- The payout for 1000 views-$5
- Minimum payout-$5
- Referral commission-10%
- Payment methods-Paypal, Payza, and Skrill
- Payment time-daily
Linkbucks
Linkbucks is another best and one of the most popular sites for shortening URLs and earning money. It boasts of high Google Page Rank as well as very high Alexa rankings. Linkbucks is paying $0.5 to $7 per 1000 views, and it depends on country to country.
The minimum payout is $10, and payment method is PayPal. It also provides the opportunity of referral earnings wherein you can earn 20% commission for a lifetime. Linkbucks runs advertising programs as well.- The payout for 1000 views-$3-9
- Minimum payout-$10
- Referral commission-20%
- Payment options-PayPal,Payza,and Payoneer
- Payment-on the daily basis
Shrinkearn.com
Shrinkearn.com is one of the best and most trusted sites from our 30 highest paying URL shortener list.It is also one of the old URL shortener sites.You just have to sign up in the shrinkearn.com website. Then you can shorten your URL and can put that URL to your website, blog or any other social networking sites.
Whenever any visitor will click your shortener URL link you will get some amount for that click.The payout rates from Shrinkearn.com is very high.You can earn $20 for 1000 views.Visitor has to stay only for 5 seconds on the publisher site and then can click on skip button to go to the requesting site.- The payout for 1000 views- up to $20
- Minimum payout-$1
- Referral commission-25%
- Payment methods-PayPal
- Payment date-10th day of every month
Friday, March 29, 2019
Top 15 Highest Paying URL Shortener to Earn Money Online 2019
Summer Internship Opportunity
Please let me know if you are interested:
This is a summer paid internship position.
The intern will be the main Unity developer for an educational program that is being designed. Unity dev skills with C# coding skills are both required. 2D dev experience, mobile development experience, and HTML5 experience would be great, but is not required.
The project will be a mobile and desktop game, built in a 2D environment.
This is a summer paid internship position.
The intern will be the main Unity developer for an educational program that is being designed. Unity dev skills with C# coding skills are both required. 2D dev experience, mobile development experience, and HTML5 experience would be great, but is not required.
The project will be a mobile and desktop game, built in a 2D environment.
Mech Battle - Robot Warfare For Android
✪ STORY
The year is 2203. The world as we know it has ceased to exist. The Great War has decimated humankind and nearly destroyed the entire planet. The last survivors are now fighting in mighty, fearsome machines, called MECHS, for the ultimate resources and supremacy on planet Earth. Get in and be a part of it!
✪ OVERVIEW
Mech Battle is a 4vs4 fast paced PVP cross platform multiplayer Mech shooter with unique features like 3rd, 1st and RTS like camera views. Build your Mech army from an awesome collection of Mechs and Weapons, customise these mighty war robots and fight your way up in the league. Battle with your friends against other real players in spectacular maps with outstanding visuals like immense explosions, beautiful landscapes and detailed mechs in game modes like Domination or Last Mech Standing.
Runs with 60 fps on any up to three year old device or newer, support for all devices
✪ FAST PACED TACTIAL ONLINE WARFARE
Exciting, action loaded battles with different tactical choices.
Mech Battle Robot Warfare : Play Store
Jump Rope For Heart, 2018
I am so happy to report that we surpassed our goal of raising $10,000 for the American Heart
Association through our Jump Rope for Heart event! I would like to give a big THANK YOU to all of our families! I am truly amazed by your generosity! I would also like to thank the parent volunteers who came to the event to help twirl long ropes, count jumps, and use the stopwatch! The JR4H "thank you gifts" should arrive in March and be sent home with students.
Playing Bronze, Silver & Gold with the long rope! |
Check out the pictures and videos below. The students had a blast! They participated in a variety of jumping and running activities. I am so proud of them for their hard work this past month.
Switching handles partner trick. |
They have become outstanding jumpers!
Click on these links for cool jump rope videos:
- 5th graders JR4H
- 5th grade (practicing in PE class)
- 4th graders JR4H
- 2nd graders (practicing in PE class)
- K-2nd grades JR4H
- Continuous Criss Cross Trick
- Doubles Trick
- Assembly performance practice (more on previous blog post)!
Long Rope Jumping |
Long Ropes |
Waiting a turn to play "Bronze, Silver & Gold" |
Hurdles |
Parent counting jumps for students. |
Long rope fun! |
Happy! |
What a fun day! |
Thursday, March 28, 2019
[Nfs] Need For Speed Underground Highly Compressed In 1 Gb
Need For Speed Underground Game Free Download
Need For Speed Underground Free Download PC Game For Windows. The town needs a driver to beat that list without getting caught by the Police
Need For Speed Underground Overview
Need For Speed Underground is developed Pioneers Production and presented by Electronic Arts. Need For Speed Underground is the game based on the high profile racing drivers. This game is all about racing. The best thing about this game is that it provides the full time environment of racing tracks. Opponents in the game are not just some rusty reckless drivers. They will also use some nasty tricks. The modes of the racing include drifting, outrun, circuit and sprint. The tracks included in the game are pretty awesome with sharp turn and a lot of short cuts. This feature is also available in Deadly Race. You can also play this game on a Multi-player LAN mode. Other than all these features the best thing is the Car show room. You can buy new sports cars and modify them. You can earn a lot of bounty. and spend it on the NOS and other engine parts to boost up your performance. There are a lot of bonus cars that you can earn after beating your opponent with a long lap which reminds me of another game called Need For Speed The Run. The drifting sessions in the game are really amazing. You can modify each and every part of the car including alignment for smooth drifting on roads and off roads.
The graphics and visuals of Need For Speed Underground the game are really smooth and gives a really great view. When the NOS is turned on. The sound effects of the cars is amazing. and also different from each and every one. The best thing is that you can listen to your favourite tracks and change them while playing. There are more than 3 views of driving your car which is a pretty good one. Because of the experience of the driver which you will also experience in a similar game called Race Injection. There is a lot of detailing and strategical chart available of each and every race you won and earned a bounty. This is a true addictive game and a best one for drivers who like to drift.
Features of Need For Speed Underground
Following are the main features of Need For Speed Underground Free Download that you will be able to experience after the first install on your Operating System.
- Best graphical and visual effects
- The maps and tracks are really amazing
- The more you play, the more you will get addicted
- Design your own new car and modify its engine
- The view modes of driving is amazing
System Requirements of Need For Speed Underground
Before you start Need For Speed Underground Free Download make sure your PC meets minimum system requirements
- Operating System: Windows XP/ Windows Vista/ Windows 7/ Windows 8 and 8.1
- CPU: Dual Core 2 Ghz
- RAM: 1 GB
- Hard disk Space: 6 GB
Need For Speed Underground Free Download
Click on below link to start Need For Speed Underground Free Download. It is a full and complete game. Just download and start playing it. We have provided direct link full setup of the game.
Improving Freemium Design - Cardinal Quest II
If you haven't already noticed, I play a lot of mobile games. I've talked about my lack of time for games now as I grow up, but that doesn't mean I like them any less. The medium and how the games are designed is what hinders me more than anything else. However, I still enjoy a good old fashioned quest or grind in an RPG. If you're anything like me and really enjoy RPG and tactic games then I'm confident that you'll love this game too. It's challenging. It can be played in short or long sessions. I feel it's one of the better mobile games I've ever played. With that being said, then why isn't this a chart topping game? Let's take a look.
What they did right...
ArtworkI love the old 8-bit art style and I think it really resonates well with their target market. It reminds me of playing old NES RPG titles such as Dragon Warrior (possibly the best NES RPG).
Difficulty
Normal levels are passable with a try or two and suicide levels are hard. I feel like this game eases me into a good challenge and I've been hooked since I downloaded the game.
Love the Varying Class
Like all the classic RPGs this game comes with several classes. Each of the the 6 classes have pros and cons that make each pretty unique from one another. Although I enjoy playing several
Publisher
I can't confirm or deny that working with a publisher is a good idea for you, but I will say that I did discover this game from an advertisement. The game is currently charting around the 250 mark in all games so I wouldn't have otherwise seen this game, but I'm really glad that I saw that ad for it (I know I can't believe I'm praising an advertisement either). Why does this tie back to the publisher? I have a suspicion that if they developer launched on their own they wouldn't have gotten the game on my radar.
What could be improved
Single Currency
You could debate this with me later, but games with a dual (or triple) currency allow you to approach virtual sales from different angles. A single currency means you're forced to a single method of earning that currency. In this case players just need to play the game over and over again. Keep grinding until players earn the desired currency to purchase what they want. Well... that or purchase the currency, but I know not many are doing that. Why? That brings me to my next topic.
Store items
Their virtual store is in dire need of help! I'd probably classify as a super-fan since I've unlocked all the classes, acts and I'm working on beating all the acts on all difficulties. However, I haven't spent a dime and I absolutely don't feel like I need to. I could throw a couple bucks their way knowing that I love their game (and I might after writing this), but I need to review and critique games from a consumer standpoint. It's safe to say that as a consumer I would not purchase anything. Let's look at some reasons why.
- Lack of things to purchase - players start off with 3 characters; each with one out of 8 unlockable options. Players can purchase 3 more classes each with 7 unlockables. That means I have a total of 45 total purchasable options (plus 1 for the extra continue after being killed). That might sound like a lot reading this article, but ideally the number of purchasable options should be infinite.
- No power-ups/consumables/modifiers - the game only sells one type of virtual goods. Unlockables. What about consumables, how about power-ups, or lastly some sort of modifier? Some of these are covered in the character unlocks, but they come as a trade-off. You can start with an ungraded weapon but start with a decreased stat. Why would I grind to unlock that? I get better weapons throughout the game, but my stat is permanently decreased? That doesn't seem like a good trade-off. I believe this is done to "balance" the game or help combat the "pay-to-win" feeling, but realistically it just seems dumb to me as a consumer.
- Equipable items - similar to the point above, I can spend currency to unlock a different starting weapon but there's a trade-off elsewhere. What about just unlocking a different starting weapon, or a modifier that gives you a better chance at rare weapon drops in game? Maybe something that expands your accessory slot from 5 to 6? What about a re-roll with the merchant in-game because what he's currently selling is trash? I could go on and on, but there are several ways they could have enhanced the looting/equipment mechanic in this game and frankly I feel like this is one of the largest pitfalls for an RPG game like this.
- Lacking MEGA FAN (AKA whale) purchase - or even a repeat purchase option. If I was REALLY impatient, I could purchase the $20 IAP and basically unlock everything. However, if I really like the game, chances are I already earned enough currency to unlock the things that I would like to unlock (which I have). Now I can continue to play the game because I like to (which I do) but there's no real reason for me to ever purchase anything.
- Could improve visuals/UI - right now there's no real store. There's an IAP store, but no virtual store for purchasing characters, consumables, goods, etc. The unlockable items are just built into the character selection scree. I love that it's part of the game's natural progression/flow, but I dislike how little screen real estate they occupy and no attention is ever drawn to these unlockables. It's up to the game to just discover them and decide which one they might want to unlock.
- Side note - don't get me wrong here. All IAPs or virtual goods should be a part of the game workflow and I do like an element of discoverability in my games, but I also believe that developers can direct or help move players towards the choices that they want their players to make. For example; once I found out there was a Paladin class I played the game for maybe 3 hours grinding to unlock that character. Perhaps if the game knew I had played 3 games back to back then maybe it should have offered me a discount on a character purchase or allowed me to purchase one for $0.99. Maybe I would've made the purchase, but not offering me anything guaranteed that I didn't purchase a thing.
Icon
Perhaps this is nitpicky but I don't like the icon at all. I feel like it doesn't have anything to do with the game. Most of the game is pixel art yet the icon isn't? I don't even know who the bull with the axe is supposed to be or how that even relates to the game. I'm guessing that perhaps it's the boss at the end of the first level, but I'm not sure.
Upselling
This is a tricky subject with most game developers because they feel like upselling is pestering players or breaking the game's difficultly setting. The developer did build in a continue option (which is a good start) but they could have done more intelligent upselling. Like mentioned earlier, what about upselling discount to someone who has played 2-3 games in a row? They obviously like your game and perhaps they'd be more inclined to make an IAP if presented a discount?
What about upselling different items at the merchant screen or allowing players to re-roll the items at a currency fee? Perhaps if you have the manpower/intelligence, you have benchmarks of what the average player has at that point in the game and you offer a slightly better weapon/option at a premium price?
No Cloud Saving
Since this is a game I LOVE playing, then I want it on my phone so I can play it on the go. However I also own an iPad that I prefer to game on when I'm at home. I wish I could sync my saved progress to Game Center so I could play between the two devices.
No missions
Let's go through my thought process when playing the game for the first time...
What's the goal? Defeat the end boss? Oh okay. Alright, Act 2. What's the goal? Defeat the end boss. Oh... I see...
Side quests are not uncommon in the RPG world and they help keep players interested in the freemium world so I felt like side quests (i.e. save this person before X time) would've been a natural fit for CQ2. I could come up with hundreds more of level side quests that could randomly generate with the levels and help keep players interested.
Side note: if there was a dual currency system perhaps they could award players 1 premium currency for completing the side mission on a particular level.
If there's no excitement to purchase...
The obvious answer is I won't purchase. I clearly liked the game and still didn't purchase anything. That's not good. I mildly enjoy Royal Revolt 2, but I've already spent $10 just after 1 week of playing that game (I know I'm late to that game but it's been on my list to play). I think I understand why the developers chose to design the game the way they did, but I believe they only hurt themselves by not utilizing F2P mechanics. What I do now that they game has already launched? I don't think converting to a paid game would be beneficial now, but I would sell extra levels as IAPs. The currency system is broke, so just sell additional levels or an entire unlock for a discounted price and walk away from this project. Take the lessons learned here and apply it towards the next game. I have no doubt it'll be better that CQ2.
Designing a game to be both fair and profitable is a difficult task. It's much easier for the game's creators to be forgiving than your players so it might be worth having a third party look at your design before launching. If you'd like help in this area feel free to contact me or hit me up on Twitter!
Wednesday, March 27, 2019
SiN Episodes: Emergence (PC)
Developer: | Ritual | | | Release Date: | 2006 | | | Systems: | PC |
This week on Super Adventures, I am finally getting around to playing SiN Episodes: Emergence! To be honest the only reason it took me this long is because I decided to hold off buying it until it was really cheap on Steam, and then that never happened. Until it finally did. I even got a free copy of SiN with it, which I fully approve of. More sequels should include the first game as a bonus... even if it is a little bit censored and doesn't include the expansion (unlike the version sold on GOG).
The first thing I noticed when I put the game on, aside from how cheap that menu text looks, is how good the opening theme is. It's like they swiped it from a Bond movie; it has vocals and everything! It's a bit disappointing that they didn't awkwardly work the word 'Emergence' into the chorus, but they found a place to include 'sin' at least. Here, have a YouTube link so you can listen to it yourself: What's the World Come To?
SiN Episodes also managed to disappoint console owners by never being ported, and PC owners by only ever getting the one episode. The mid-2000s episodic gaming experiment really didn't work out so great for first person shooter sequels built on the Source engine. That said, I'm sure Valve's Half-Life episodes sold a hell of a lot better than this did.
The original SiN had the misfortune of being released just two weeks before before the groundbreaking Half-Life and being entirely overshadowed by it, then the exact same thing happened with Emergence when it came out three weeks before the massively hyped Half-Life 2: Episode One! The game launched on Steam back when the store was practically empty and still didn't sell enough for even one more of its nine planned episodes to enter development. But the SiN series truly died when developer Ritual was acquired by MumboJumbo shortly afterwards and sent to casual game development hell for eternity instead.
Content warning: this article contains a screenshot of a model in lingerie. A 2006-era real-time 3D model.
Read on »
Tuesday, March 26, 2019
Finishing Up 2017
This post has been a long time coming, but I guess better late than never.
Even though I haven't been posting anything, I wasn't completely idle in the last few months of the year. I ended up finishing my Soviet project, painted a few battalions and batteries of Napoleonics as well as got started with a quick few minis in the Analogue Hobbies Painting Challenge. The end of the year also saw me switch jobs, which lead to a rather busy December and start of the new year trying to get on track with new responsibilities and new products in an industry I haven't worked before.
Numbers wise 2017 wasn't too impressive with the lowest numbers of miniatures painted and games played in years. My painting slump that started in the last half of 2016 continued through 2017 and I didn't really start to get my painting interests back until the autumn. As well as a distinct drop in the quantity of games played the variety also came down as my schedule didn't really fit our Wednesday gamedays which included more varied game systems and mostly could just fit the Flames of War gamedays in and those only partly out of responsibility as I'm one of the guys running them and opening the club for others. 2018 should hopefully bring a change to that with a new Napoleonics campaign finally starting as well as changed schedules at home allowing me to participate more in different game days at the club.
To finish off the post a quick gallery of the stuff that I managed to finish up in the last couple of months as well as a group shot of the whole Soviet project. 11 more T-34s, a Katyusha battery, the two battalions of Prince Anton Regiment and two batteries for my 1813 Saxons as well as some wild animals that I started my Painting Challenge with.
Even though I haven't been posting anything, I wasn't completely idle in the last few months of the year. I ended up finishing my Soviet project, painted a few battalions and batteries of Napoleonics as well as got started with a quick few minis in the Analogue Hobbies Painting Challenge. The end of the year also saw me switch jobs, which lead to a rather busy December and start of the new year trying to get on track with new responsibilities and new products in an industry I haven't worked before.
Numbers wise 2017 wasn't too impressive with the lowest numbers of miniatures painted and games played in years. My painting slump that started in the last half of 2016 continued through 2017 and I didn't really start to get my painting interests back until the autumn. As well as a distinct drop in the quantity of games played the variety also came down as my schedule didn't really fit our Wednesday gamedays which included more varied game systems and mostly could just fit the Flames of War gamedays in and those only partly out of responsibility as I'm one of the guys running them and opening the club for others. 2018 should hopefully bring a change to that with a new Napoleonics campaign finally starting as well as changed schedules at home allowing me to participate more in different game days at the club.
To finish off the post a quick gallery of the stuff that I managed to finish up in the last couple of months as well as a group shot of the whole Soviet project. 11 more T-34s, a Katyusha battery, the two battalions of Prince Anton Regiment and two batteries for my 1813 Saxons as well as some wild animals that I started my Painting Challenge with.
Empiricism And The Limits Of Gradient Descent
This post is actually about artificial intelligence, and argues a position that many AI researchers will disagree with. Specifically, it argues that the method underlying most of deep learning has severe limitations which another, much less popular method can overcome. But let's start with talking about epistemology, the branch of philosophy which is concerned with how we know things. Then we'll get back to AI.
Be warned: this post contains serious simplifications of complex philosophical concepts and arguments. If you are a philosopher, please do not kill me for this. Even if you are not a philosopher, just hear me out, OK?
In the empiricist tradition in epistemology, we get knowledge from the senses. In the 17th century, John Locke postulated that the mind is like a blank slate, and the only way which we can get knowledge is through sense impressions: these impressions figuratively write our experience onto this blank slate. In other words, what we perceive through our eyes, ears and other sense organs causes knowledge to be formed and accumulated within us.
The empiricist tradition of thought has been very influential for the last few centuries, and philosophers such as Hume, Mill and Berkeley contributed to the development of empiricist epistemology. These thinkers shared the conviction that knowledge comes to us through experiencing the world outside of us through our sense. They differed in what they thought we can directly experience - for example, Hume though we can not experience causality directly, only sequences of world-states - and exactly how the sense impressions create knowledge, but they agree that the sense impressions are what creates knowledge.
In the 20th century, many philosophers wanted to explain how the (natural) sciences could be so successful, and what set the scientific mode of acquiring knowledge apart from superstition. Many of them were empiricists. In particular, the Vienna Circle, a group of philosophers, mathematicians, and physicists inspired by the early work of Wittgenstein, articulated a philosophy that came to be known as Logical Empiricism. The basic idea is that sense impressions is all there is, and that all meaningful statements are complex expressions that can be analyzed down to their constituent statements about sense impressions. We gain knowledge through a process known as induction, where we generalize from our sense impressions. For example, after seeing a number of swans that are white you can induce that swans are white.
A philosopher that was peripheral to the Vienna Circle but later became a major figure in epistemology in his own right was Karl Popper. Popper shared the logical empiricists' zeal for explaining how scientific knowledge was produced, but differed radically in where he thought knowledge came from. According to Popper, facts do not come from sense impressions. Instead, they come "from within": we formulate hypotheses, meaning educated guesses, about the world. These hypotheses are then tested against our sense impressions. So, if we hypothesize that swans are white, we can then check this with what our eyes tell us. Importantly, we should try to falsify our hypotheses, not to verify them. If the hypothesis is that swans are white, we should go looking for black swans, because finding one would falsify our hypothesis. This can be easily motivated with that if we already think swans are white, we're not getting much new information by seeing lots of white swans, but seeing a black swan (or trying hard but failing to find a black swan) would give us more new information.
Popper called his school of thought "critical rationalism". This connects to the long tradition of rationalist epistemology, which just like empiricist epistemology has been around for most of the history of philosophy. For example, Descartes' "I think, therefore I am" is a prime example of knowledge which does not originate in the senses.
Among (natural) scientists with a philosophical bent, Popper is extremely popular. Few modern scientists would describe themselves as logical empiricists, but many would describe themselves as critical rationalists. The main reason for this is that Popper describes ways of successfully creating scientific knowledge, and the logical empiricists do not. To start with the simple case, if you want to arrive at the truth about the color of swans, induction is never going to get you there. You can look at 999999 white swans and conclude that they are all white, but the millionth may be black. So there can be no certainty. With Popper's hypothetico-deductive method you'd make a hypothesis about the whiteness of swans, and then go out and actively try to find non-white swans. There's never any claim of certainty, just of an hypothesis having survived many tests.
More importantly, though, the logical empiricist story suffers from the problem that more complex facts are simply not in the data. F=ma and E=mc2 are not in the data. However many times you measure forces, masses and accelerations of things, the idea that the force equals mass times acceleration is not going to simply present itself. The theories that are at the core of our knowledge cannot be discovered in the data. They have to be invented, and then tested against the data. And this is not confined to large, world-changing theories.
If I already have the concepts of swan, white and black at the ready, I can use induction to arrive at the idea that all swans are white. But first I need to invent these concepts. I need to decide that there is such a thing as a swan. Inductivists such as Hume would argue that this could happen through observing that "a bundle of sense impressions" tend to co-occur whenever we see a swan. But a concept such a swan is actually a theory: that the animal is the same whether it's walking of flying, that it doesn't radically change its shape or color, and so on. This theory needs to somehow be invented, and then tested against observation.
In other words, empiricism is at best a very partial account of how we get knowledge. On its own, it can't explain how we arrive at complex concepts or theories, and it does not deliver certainty. Perhaps most importantly, the way we humans actually do science (and other kinds of advanced knowledge production) is much more like critical rationalism than like empiricism. We come up with theories, and we work to confirm of falsify them. Few scientists just sit around and observe all day.
Enough about epistemology for now. I promised you I would talk about artificial intelligence, and now I will.
Underlying most work in neural networks and deep learning (the two terms are currently more or less synonymous) is the idea of stochastic gradient descent, in particular as implemented in the backpropagation algorithm. The basic idea is that you can learn to map inputs to outputs through feeding the inputs to the network, seeing what comes out at the other hand, and compare it with the correct answer. You then adjust all the connection weights in the neural network so as to bring the output closer to the correct output. This process, which has to be done over and over again, can be seen as descending the error gradient, thus the name gradient descent. You can also think of this as the reward signal pushing around the model, repelling it whenever it does something bad.
(How do you know the correct output? In supervised learning, you have a training set with lots of inputs (e.g. pictures of faces) and corresponding outputs (e.g. the names of the people in the pictures). In reinforcement learning it is more complex, as the input is what an agent sees of the world, and the "correct" output is typically some combination of the actual reward the agent gets and the model's own estimate of the reward.)
Another type of learning algorithm that can be used for both supervised learning and reinforcement learning (and many other things as well) is evolutionary algorithms. This is a family of algorithms based on mimicking Darwinian evolution by natural selection; algorithms in this family include evolution strategies and genetic algorithms. When using evolution to train a neural net, you keep a population of different neural nets and test them on whatever task they are supposed to perform, such as recognizing faces or playing a game. Every generation, you throw out the worst-performing nets, and replace them with "offspring" of the better-performing neural nets; essentially, you make copies and combinations of the better nets and apply small perturbations ("mutations") to them. Eventually, these networks learn to perform their tasks well.
So we have two types of algorithms that can both be used for performing both supervised learning and reinforcement learning (among other things). How do they measure up?
To begin with, some people wonder how evolutionary algorithms could work at all. It is perhaps important to point out here that evolutionary algorithms are not random search. While randomness is used to create new individuals (models) from old ones, fitness-based selection is necessary for these algorithms to work. Even a simple evolution strategy, which can be implemented in ten or so lines of code, can solve many problems well. Additionally, decades of development of the core idea of evolution as a learning and search strategy has resulted in many more sophisticated algorithms, including algorithms that base the generation of new models on adaptive models of the search space, algorithms that handle multiple objectives, and algorithms that find diverse sets of solutions.
Gradient descent is currently much more popular than evolution in the machine learning community. In fact, many machine learning researchers do not even take evolutionary algorithms seriously. The main reason for this is probably the widespread belief that evolutionary algorithms are very inefficient compared to gradient descent. This is because evolutionary algorithms seem to make use of less information than gradient descent does. Instead of incorporating feedback every time a reward is found in a reinforcement learning problem, in a typical evolutionary algorithm only the end result of an episode is taken into. For example, when learning to play Super Mario Bros, you could easily tell a gradient descent-based algorithm (such as Q-learning) to update every time Mario picks up a coin or gets hurt, whereas with an evolutionary algorithm you would usually just look at how far Mario got along the level and use that as feedback.
Another way in which evolution uses less information than gradient descent is that the changes to the network are not necessarily done so as to minimize the error, or in general to make the network as good as possible. Instead, the changes are generally completely random. This strikes many as terribly wasteful. If you have a gradient, why not use it?
(Additionally, some people seem to dislike evolutionary computation because it is too simple and mathematically uninteresting. It is true that you can't prove many useful theorems about evolutionary algorithms. But come on, that's not a serious argument against evolutionary algorithms, more like a prejudice.)
So is the idea that evolutionary algorithms learn less efficiently than gradient descent supported by empirical evidence? Yes and maybe. There is no question that the most impressive results coming out of deep learning research are all built on gradient descent. And for supervised learning, I have not seen any evidence that evolution achieves anything like the same sample-efficiency as gradient descent. In reinforcement learning, most of the high-profile results rely on gradient descent, but they also rely on enormous computational resources. For some reinforcement learning problems which can be solved with small networks, evolutionary algorithms perform much better than any gradient descent-based methods. They also perform surprisingly well on playing Atari games from high-dimensional visual input (which requires large, deep networks) and are the state of the art on the MuJoCo simulated robot control task.
Does evolutionary algorithms have any advantage over gradient descent? Yes. To begin with, you can use them even in cases where you cannot calculate a gradient, i.e. your error function is not differentiable. You cannot directly learn program code or graph structures with gradient descent (though there are indirect ways of doing it) but that's easy for evolutionary algorithms. However, that's not the angle I wanted to take here. Instead I wanted to reconnect to the discussion of epistemology this post started with.
Here's my claim: learning by gradient descent is an implementation of empiricist induction, whereas evolutionary computation is much closer to the hypothetico-deductive process of Popper's critical rationalism. Therefore, learning by gradient descent suffers from the same kind of limitations as the empiricist view of knowledge acquisition does, and there are things that evolutionary computation can learn but gradient descent probably cannot.
How are those philosophical concepts similar to these algorithms? In gradient descent, you are performing frequent updates in the direction that minimizes error. The error signal can be seen as causal: when there is an error, that error causes the model to change in a particular way. This is the same process as when a new observation causes a change in a person's belief ("writing our experience on the blank slate of the mind"), within the empiricist model of induction. These updates are frequent, making sure that every signal has a distinct impression on the model (batch learning is often used with gradient descent, but generally seen as a necessary evil). In contrast, in evolutionary computation, the change in the model is not directly caused by the error signal. The change is stochastic, not directly dependent on the error and not in general in the direction that minimizes the error, and in general much less common. Thus the model can be seen as a hypothesis, which is tested through applying the fitness function. Models are generated not from the data, but from previous hypotheses and random changes; they are evaluated by testing their consequences using the fitness function. If they are good, they stay in the population and more hypotheses are generated from them; if they are bad, they die.
How about explicitly trying to falsify the hypothesis? This is a key part of the Popperian mode of knowledge acquisition, but it does not seem to be part of evolutionary computation per se. However, it is part of competitive coevolution. In competitive coevolution, two or more populations are kept, and the fitness of the individuals in one population are dependent on how well they are perform against individuals in the other population. For example, one population could contain predators and the other prey, or one could contain image generators and the other image recognizers. As far as I know, the first successful example of competitive coevolution was demonstrated in 1990; the core idea was later re-invented (though with gradient descent instead of evolutionary search) in 2014 as generative adversarial networks.
If you accept the idea that learning by gradient descent is fundamentally a form of induction as described by empiricists, and that evolutionary computation is fundamentally more like the hypothetico-deductive process of Popperian critical rationalism, where does this take us? Does it say anything about what these types of algorithms can and cannot do?
I believe so. I think that certain things are extremely unlikely to ever be learned by gradient descent. To take an obvious example, I have a hard time seeing gradient descent ever learning F=ma or E=mc2. It's just not in the data - it has to be invented. And before you reply that you have a hard time seeing how evolution could learn such a complex law, note that using evolutionary computation to discover natural laws of a similar complexity has been demonstrated almost a decade ago. In this case, the representation (mathematical expressions represented as trees) is distinctly non-differentiable, so could not even in principle be learned through gradient descent. I also think that evolutionary algorithms, working by fewer and bolder strokes rather than a million tiny steps, is more likely to learn all kinds of abstract concepts. Perhaps the area where this is likely to be most important is reinforcement learning, where allowing the reward to push the model around seems to not be a very good idea in general and testing and discarding complete strategies may be much better.
So what should we do? Combine multiple types of learning of course! There are already hundreds (or perhaps thousands) of researchers working on evolutionary computation, but for historical reasons the evolutionary computation community is rather dissociated from the community of researchers working on machine learning by gradient descent. Crossover between evolutionary learning and gradient descent yielded important insights three decades ago, and I think there is so much more to learn. When you think about it, our own intelligence is a combination of evolutionary learning and lifetime learning, and it makes sense to build artificial intelligence on similar principles.
I am not saying gradient descent is a dead end nor that it will necessarily be superseded. Backpropagation is obviously a tremendously useful algorithm and gradient descent a very powerful idea. I am also not saying that evolutionary algorithms are the best solution for everything - they very clearly are not (though some have suggested that they are the second best solution for everything). But I am saying that backpropagation is by necessity only part of the solution to the problem of creating learning machines, as it is fundamentally limited to performing induction, which is not how real discoveries are made.
Some more reading: Kenneth Stanley has though a lot about the advantages of evolution in learning, and he and his team has written some very insightful things about this. Several large AI labs have teams working on evolutionary deep learning, including Uber AI, Sentient Technologies, DeepMind, and OpenAI. Gary Marcus has recently discussed the virtues of "innateness" (learning on evolutionary timescales) in machine learning. I have worked extensively with evolutionary computation in game contexts, such as for playing games and generating content for games. Nine years ago, me and a perhaps surprising set of authors set out to briefly characterize the differences between phylogenetic (evolutionary) and ontogenetic (gradient descent-based) reinforcement learning. I don't think we got to the core of the matter back then - this blog post summarizes a lot of what I was thinking but did not know how to express properly then. Thanks to several dead philosophers for helping me express my thoughts better. There's clearly more serious thinking to be done about this problem.
I'm thinking about turning this blog post into a proper paper at some point, so feedback of all kinds is welcome.
Be warned: this post contains serious simplifications of complex philosophical concepts and arguments. If you are a philosopher, please do not kill me for this. Even if you are not a philosopher, just hear me out, OK?
In the empiricist tradition in epistemology, we get knowledge from the senses. In the 17th century, John Locke postulated that the mind is like a blank slate, and the only way which we can get knowledge is through sense impressions: these impressions figuratively write our experience onto this blank slate. In other words, what we perceive through our eyes, ears and other sense organs causes knowledge to be formed and accumulated within us.
The empiricist tradition of thought has been very influential for the last few centuries, and philosophers such as Hume, Mill and Berkeley contributed to the development of empiricist epistemology. These thinkers shared the conviction that knowledge comes to us through experiencing the world outside of us through our sense. They differed in what they thought we can directly experience - for example, Hume though we can not experience causality directly, only sequences of world-states - and exactly how the sense impressions create knowledge, but they agree that the sense impressions are what creates knowledge.
In the 20th century, many philosophers wanted to explain how the (natural) sciences could be so successful, and what set the scientific mode of acquiring knowledge apart from superstition. Many of them were empiricists. In particular, the Vienna Circle, a group of philosophers, mathematicians, and physicists inspired by the early work of Wittgenstein, articulated a philosophy that came to be known as Logical Empiricism. The basic idea is that sense impressions is all there is, and that all meaningful statements are complex expressions that can be analyzed down to their constituent statements about sense impressions. We gain knowledge through a process known as induction, where we generalize from our sense impressions. For example, after seeing a number of swans that are white you can induce that swans are white.
A philosopher that was peripheral to the Vienna Circle but later became a major figure in epistemology in his own right was Karl Popper. Popper shared the logical empiricists' zeal for explaining how scientific knowledge was produced, but differed radically in where he thought knowledge came from. According to Popper, facts do not come from sense impressions. Instead, they come "from within": we formulate hypotheses, meaning educated guesses, about the world. These hypotheses are then tested against our sense impressions. So, if we hypothesize that swans are white, we can then check this with what our eyes tell us. Importantly, we should try to falsify our hypotheses, not to verify them. If the hypothesis is that swans are white, we should go looking for black swans, because finding one would falsify our hypothesis. This can be easily motivated with that if we already think swans are white, we're not getting much new information by seeing lots of white swans, but seeing a black swan (or trying hard but failing to find a black swan) would give us more new information.
Popper called his school of thought "critical rationalism". This connects to the long tradition of rationalist epistemology, which just like empiricist epistemology has been around for most of the history of philosophy. For example, Descartes' "I think, therefore I am" is a prime example of knowledge which does not originate in the senses.
Among (natural) scientists with a philosophical bent, Popper is extremely popular. Few modern scientists would describe themselves as logical empiricists, but many would describe themselves as critical rationalists. The main reason for this is that Popper describes ways of successfully creating scientific knowledge, and the logical empiricists do not. To start with the simple case, if you want to arrive at the truth about the color of swans, induction is never going to get you there. You can look at 999999 white swans and conclude that they are all white, but the millionth may be black. So there can be no certainty. With Popper's hypothetico-deductive method you'd make a hypothesis about the whiteness of swans, and then go out and actively try to find non-white swans. There's never any claim of certainty, just of an hypothesis having survived many tests.
More importantly, though, the logical empiricist story suffers from the problem that more complex facts are simply not in the data. F=ma and E=mc2 are not in the data. However many times you measure forces, masses and accelerations of things, the idea that the force equals mass times acceleration is not going to simply present itself. The theories that are at the core of our knowledge cannot be discovered in the data. They have to be invented, and then tested against the data. And this is not confined to large, world-changing theories.
If I already have the concepts of swan, white and black at the ready, I can use induction to arrive at the idea that all swans are white. But first I need to invent these concepts. I need to decide that there is such a thing as a swan. Inductivists such as Hume would argue that this could happen through observing that "a bundle of sense impressions" tend to co-occur whenever we see a swan. But a concept such a swan is actually a theory: that the animal is the same whether it's walking of flying, that it doesn't radically change its shape or color, and so on. This theory needs to somehow be invented, and then tested against observation.
In other words, empiricism is at best a very partial account of how we get knowledge. On its own, it can't explain how we arrive at complex concepts or theories, and it does not deliver certainty. Perhaps most importantly, the way we humans actually do science (and other kinds of advanced knowledge production) is much more like critical rationalism than like empiricism. We come up with theories, and we work to confirm of falsify them. Few scientists just sit around and observe all day.
Enough about epistemology for now. I promised you I would talk about artificial intelligence, and now I will.
Underlying most work in neural networks and deep learning (the two terms are currently more or less synonymous) is the idea of stochastic gradient descent, in particular as implemented in the backpropagation algorithm. The basic idea is that you can learn to map inputs to outputs through feeding the inputs to the network, seeing what comes out at the other hand, and compare it with the correct answer. You then adjust all the connection weights in the neural network so as to bring the output closer to the correct output. This process, which has to be done over and over again, can be seen as descending the error gradient, thus the name gradient descent. You can also think of this as the reward signal pushing around the model, repelling it whenever it does something bad.
(How do you know the correct output? In supervised learning, you have a training set with lots of inputs (e.g. pictures of faces) and corresponding outputs (e.g. the names of the people in the pictures). In reinforcement learning it is more complex, as the input is what an agent sees of the world, and the "correct" output is typically some combination of the actual reward the agent gets and the model's own estimate of the reward.)
Another type of learning algorithm that can be used for both supervised learning and reinforcement learning (and many other things as well) is evolutionary algorithms. This is a family of algorithms based on mimicking Darwinian evolution by natural selection; algorithms in this family include evolution strategies and genetic algorithms. When using evolution to train a neural net, you keep a population of different neural nets and test them on whatever task they are supposed to perform, such as recognizing faces or playing a game. Every generation, you throw out the worst-performing nets, and replace them with "offspring" of the better-performing neural nets; essentially, you make copies and combinations of the better nets and apply small perturbations ("mutations") to them. Eventually, these networks learn to perform their tasks well.
So we have two types of algorithms that can both be used for performing both supervised learning and reinforcement learning (among other things). How do they measure up?
To begin with, some people wonder how evolutionary algorithms could work at all. It is perhaps important to point out here that evolutionary algorithms are not random search. While randomness is used to create new individuals (models) from old ones, fitness-based selection is necessary for these algorithms to work. Even a simple evolution strategy, which can be implemented in ten or so lines of code, can solve many problems well. Additionally, decades of development of the core idea of evolution as a learning and search strategy has resulted in many more sophisticated algorithms, including algorithms that base the generation of new models on adaptive models of the search space, algorithms that handle multiple objectives, and algorithms that find diverse sets of solutions.
Gradient descent is currently much more popular than evolution in the machine learning community. In fact, many machine learning researchers do not even take evolutionary algorithms seriously. The main reason for this is probably the widespread belief that evolutionary algorithms are very inefficient compared to gradient descent. This is because evolutionary algorithms seem to make use of less information than gradient descent does. Instead of incorporating feedback every time a reward is found in a reinforcement learning problem, in a typical evolutionary algorithm only the end result of an episode is taken into. For example, when learning to play Super Mario Bros, you could easily tell a gradient descent-based algorithm (such as Q-learning) to update every time Mario picks up a coin or gets hurt, whereas with an evolutionary algorithm you would usually just look at how far Mario got along the level and use that as feedback.
Another way in which evolution uses less information than gradient descent is that the changes to the network are not necessarily done so as to minimize the error, or in general to make the network as good as possible. Instead, the changes are generally completely random. This strikes many as terribly wasteful. If you have a gradient, why not use it?
(Additionally, some people seem to dislike evolutionary computation because it is too simple and mathematically uninteresting. It is true that you can't prove many useful theorems about evolutionary algorithms. But come on, that's not a serious argument against evolutionary algorithms, more like a prejudice.)
So is the idea that evolutionary algorithms learn less efficiently than gradient descent supported by empirical evidence? Yes and maybe. There is no question that the most impressive results coming out of deep learning research are all built on gradient descent. And for supervised learning, I have not seen any evidence that evolution achieves anything like the same sample-efficiency as gradient descent. In reinforcement learning, most of the high-profile results rely on gradient descent, but they also rely on enormous computational resources. For some reinforcement learning problems which can be solved with small networks, evolutionary algorithms perform much better than any gradient descent-based methods. They also perform surprisingly well on playing Atari games from high-dimensional visual input (which requires large, deep networks) and are the state of the art on the MuJoCo simulated robot control task.
Does evolutionary algorithms have any advantage over gradient descent? Yes. To begin with, you can use them even in cases where you cannot calculate a gradient, i.e. your error function is not differentiable. You cannot directly learn program code or graph structures with gradient descent (though there are indirect ways of doing it) but that's easy for evolutionary algorithms. However, that's not the angle I wanted to take here. Instead I wanted to reconnect to the discussion of epistemology this post started with.
Here's my claim: learning by gradient descent is an implementation of empiricist induction, whereas evolutionary computation is much closer to the hypothetico-deductive process of Popper's critical rationalism. Therefore, learning by gradient descent suffers from the same kind of limitations as the empiricist view of knowledge acquisition does, and there are things that evolutionary computation can learn but gradient descent probably cannot.
How are those philosophical concepts similar to these algorithms? In gradient descent, you are performing frequent updates in the direction that minimizes error. The error signal can be seen as causal: when there is an error, that error causes the model to change in a particular way. This is the same process as when a new observation causes a change in a person's belief ("writing our experience on the blank slate of the mind"), within the empiricist model of induction. These updates are frequent, making sure that every signal has a distinct impression on the model (batch learning is often used with gradient descent, but generally seen as a necessary evil). In contrast, in evolutionary computation, the change in the model is not directly caused by the error signal. The change is stochastic, not directly dependent on the error and not in general in the direction that minimizes the error, and in general much less common. Thus the model can be seen as a hypothesis, which is tested through applying the fitness function. Models are generated not from the data, but from previous hypotheses and random changes; they are evaluated by testing their consequences using the fitness function. If they are good, they stay in the population and more hypotheses are generated from them; if they are bad, they die.
How about explicitly trying to falsify the hypothesis? This is a key part of the Popperian mode of knowledge acquisition, but it does not seem to be part of evolutionary computation per se. However, it is part of competitive coevolution. In competitive coevolution, two or more populations are kept, and the fitness of the individuals in one population are dependent on how well they are perform against individuals in the other population. For example, one population could contain predators and the other prey, or one could contain image generators and the other image recognizers. As far as I know, the first successful example of competitive coevolution was demonstrated in 1990; the core idea was later re-invented (though with gradient descent instead of evolutionary search) in 2014 as generative adversarial networks.
If you accept the idea that learning by gradient descent is fundamentally a form of induction as described by empiricists, and that evolutionary computation is fundamentally more like the hypothetico-deductive process of Popperian critical rationalism, where does this take us? Does it say anything about what these types of algorithms can and cannot do?
I believe so. I think that certain things are extremely unlikely to ever be learned by gradient descent. To take an obvious example, I have a hard time seeing gradient descent ever learning F=ma or E=mc2. It's just not in the data - it has to be invented. And before you reply that you have a hard time seeing how evolution could learn such a complex law, note that using evolutionary computation to discover natural laws of a similar complexity has been demonstrated almost a decade ago. In this case, the representation (mathematical expressions represented as trees) is distinctly non-differentiable, so could not even in principle be learned through gradient descent. I also think that evolutionary algorithms, working by fewer and bolder strokes rather than a million tiny steps, is more likely to learn all kinds of abstract concepts. Perhaps the area where this is likely to be most important is reinforcement learning, where allowing the reward to push the model around seems to not be a very good idea in general and testing and discarding complete strategies may be much better.
So what should we do? Combine multiple types of learning of course! There are already hundreds (or perhaps thousands) of researchers working on evolutionary computation, but for historical reasons the evolutionary computation community is rather dissociated from the community of researchers working on machine learning by gradient descent. Crossover between evolutionary learning and gradient descent yielded important insights three decades ago, and I think there is so much more to learn. When you think about it, our own intelligence is a combination of evolutionary learning and lifetime learning, and it makes sense to build artificial intelligence on similar principles.
I am not saying gradient descent is a dead end nor that it will necessarily be superseded. Backpropagation is obviously a tremendously useful algorithm and gradient descent a very powerful idea. I am also not saying that evolutionary algorithms are the best solution for everything - they very clearly are not (though some have suggested that they are the second best solution for everything). But I am saying that backpropagation is by necessity only part of the solution to the problem of creating learning machines, as it is fundamentally limited to performing induction, which is not how real discoveries are made.
Some more reading: Kenneth Stanley has though a lot about the advantages of evolution in learning, and he and his team has written some very insightful things about this. Several large AI labs have teams working on evolutionary deep learning, including Uber AI, Sentient Technologies, DeepMind, and OpenAI. Gary Marcus has recently discussed the virtues of "innateness" (learning on evolutionary timescales) in machine learning. I have worked extensively with evolutionary computation in game contexts, such as for playing games and generating content for games. Nine years ago, me and a perhaps surprising set of authors set out to briefly characterize the differences between phylogenetic (evolutionary) and ontogenetic (gradient descent-based) reinforcement learning. I don't think we got to the core of the matter back then - this blog post summarizes a lot of what I was thinking but did not know how to express properly then. Thanks to several dead philosophers for helping me express my thoughts better. There's clearly more serious thinking to be done about this problem.
I'm thinking about turning this blog post into a proper paper at some point, so feedback of all kinds is welcome.
Tech Book Face Off: Coffeescript Vs. Simplifying Javascript
I really like this setup for a Tech Book Face Off because it's implicitly asking the question of what can be done to improve the quagmire that is the JavaScript language. Should we try to simplify things and pare down what we use in the language to make it more manageable, or should we ditch it and switch to a language with better syntax that transpiles into JavaScript? For the latter option, I picked one of the few books on the CoffeeScript language, aptly named CoffeeScript: Accelerated JavaScript Development by Trevor Burnham. Then, for sticking with JavaScript, I went with a recently published book by Joe Morgan titled Simplifying JavaScript: Writing Modern JavaScript with ES5, ES6, and Beyond. It should be interesting to see what can be done to make JavaScript more palatable.
This book was written a few years ago now, in early 2015, but CoffeeScript is still alive and kicking, especially for Ruby on Rails developers as the default front-end language of choice. CoffeeScript is integrated into Rails' asset pipeline, so it gets automatically transpiled to JavaScript and minified as part of the production release process. If you're already comfortable with JavaScript, and even more so if you know Ruby, then CoffeeScript is a breeze to learn.
The ease with which this language can be picked up is exemplified by the book, since it's one of the shortest books I've ever read on a programming language. Over half of the book has more to do with examples, applications, and other stuff tangential to CoffeeScript, rather than the language proper. The book itself is just short of 100 pages while the content on syntax and usage of the language is condensed into the first half of the book.
As all books like this do, the first chapter starts out with how to install the language and configure the environment. It's pretty straightforward stuff. Then, we get into all of the syntax changes that CoffeeScript brings to JavaScript, which essentially defines the language since all of the features are the same as JavaScript's. Chapter 2 shows how function and variable declarations are different, and much shorter. Chapter 3 demonstrates some nice syntactical sugar for arrays in the form of ranges, and iteration can be done more flexibly with for comprehensions. Chapter 4 gets into the syntax features for defining classes and doing inheritance concisely.
Most of the syntax will look quite familiar to Rubyists, including class instance variables denoted with an '@' prefix, the string interpolation notation, unless conditionals, and array ranges. Here's an example from the book showing a number of the syntax features:
The last three chapters of the book delve into different frameworks and packages in the JavaScript universe that can be used with CoffeeScript, and the vehicle for exploring these things is a (heavily) stripped down version of the Trello app. Chapter 5 goes through how to create the front-end portion of the app with jQuery and Backbone.js. Chapter 6 adds a backend server for the app with Node and Express. Chapter 7 explores how to test the app with Intern. All of the code for the front-end, backend, and tests is written in CoffeeScript, and the transpiling is setup to be managed with Grunt. It's nice to see multiple different examples of how to use CoffeeScript anywhere that JavaScript would normally be used, just to get an idea of how to transition to CoffeeScript in multiple ways.
Throughout the book, Burnham presents everything in a straightforward, no-frills manner. Everything is clear and logical, and his concise descriptions are part of the reason the book is so short. He assumes you already know JavaScript—which is much appreciated—and he doesn't go into extended explanations of JavaScripts features. It's just the facts on how CoffeeScript is different and what the syntax is for the features it compresses. It's awfully hard for me not to recommend this book simply because it's so short and to the point. It only took a few hours to read through, and now I know a better way to code JavaScript. There's not much more I can ask of a programming language book.
Every language has those more advanced books that assume you already know the language and instead of covering the basics and syntax, it provides advice on how to write idiomatically in the language. I've read these books for C++, Ruby, and JavaScript and found them to be surprisingly enjoyable to read. That was not the case with this book, but before I get too far into criticisms, I should summarize what this book does well.
Simplifying JavaScript is organized into ten chapters with each chapter broken into a set of tips that total 51 tips in all. These tips each explain one new feature of the JavaScript language from the new ES5, ES6, and ES2017 specifications. Some features, like the spread operator take multiple tips to fully cover. Then, the last chapter covers some features of the JavaScript development environment, like npm, that are not part of the language and have been around a bit longer than these newer specifications.
Most of the new features significantly improve and simplify the language, and they include things like:
Morgan does a nice job introducing and justifying the new features at times:
These exciting new features and simple explanations were the good parts, so why did I end up not liking this book much? Mostly, it was because of how long-winded the explanations were. Each tip dragged on for what felt like twice as long as it needed to, and the book could have easily been half as long. CoffeeScript showed how to present language features in a clear, concise way. This book took the opposite approach. Then, to make matters worse, it was written in the second person with the author always referring directly to the reader with you this and you that. Normally I don't mind a few references to you, the reader, every now and then, but this was constant so it became constantly aggravating.
Beyond the writing style, some of the justifications for various features didn't hold much water. For example, when trying to rationalize the new variable declarations, Morgan presented an example of code where the variables are declared at the top, and then there are a hundred lines of code before those variables are used again. Then he says, "Ignore the fact that a block of code shouldn't be 100 lines long; you have a large amount of code where lots of changes are occurring." I don't know about you, but I wouldn't declare a variable and then not use it for a hundred lines. I would declare it right before use. He shouldn't have to contrive a bad example like that to justify the new const and let declarations. The improved ability to relate intent in the code should be reason enough.
In another example for why one must be careful when testing for truthy values in a conditional, he shows some code that would fail because a value of 0 is falsey:
Other explanations were somewhat lacking in clarity. Late in the book, when things start to get complicated with promises, the explanations seem to get much more brief and gloss over how promises actually work mechanically and how the code executes. After having things explained in excruciating detail and in overly simplistic terms, I was surprised at how little explanation was given for promises. A step-by-step walk through of how the code runs when a promise executes would have been quite helpful in understanding that feature better. I figured it out, but through no fault of the book.
Overall, it was a disappointing read, and didn't at all live up to my expectations built up from similar books. The tone of the book was meant more for a beginner while the content was geared toward an intermediate to expert programmer. While learning about the new features of JavaScript was great, and there are plenty of new features to get excited about, there must be a better way to learn about them. At least it was a quick read, and refreshing my memory will be easy by skimming the titles of the tips. I wouldn't recommend Simplifying JavaScript to anyone looking to come up to speed on modern JavaScript. There are better options out there.
VS. |
CoffeeScript
This book was written a few years ago now, in early 2015, but CoffeeScript is still alive and kicking, especially for Ruby on Rails developers as the default front-end language of choice. CoffeeScript is integrated into Rails' asset pipeline, so it gets automatically transpiled to JavaScript and minified as part of the production release process. If you're already comfortable with JavaScript, and even more so if you know Ruby, then CoffeeScript is a breeze to learn.
The ease with which this language can be picked up is exemplified by the book, since it's one of the shortest books I've ever read on a programming language. Over half of the book has more to do with examples, applications, and other stuff tangential to CoffeeScript, rather than the language proper. The book itself is just short of 100 pages while the content on syntax and usage of the language is condensed into the first half of the book.
As all books like this do, the first chapter starts out with how to install the language and configure the environment. It's pretty straightforward stuff. Then, we get into all of the syntax changes that CoffeeScript brings to JavaScript, which essentially defines the language since all of the features are the same as JavaScript's. Chapter 2 shows how function and variable declarations are different, and much shorter. Chapter 3 demonstrates some nice syntactical sugar for arrays in the form of ranges, and iteration can be done more flexibly with for comprehensions. Chapter 4 gets into the syntax features for defining classes and doing inheritance concisely.
Most of the syntax will look quite familiar to Rubyists, including class instance variables denoted with an '@' prefix, the string interpolation notation, unless conditionals, and array ranges. Here's an example from the book showing a number of the syntax features:
class Tribble
constructor: -> # class constructor definition
@isAlive = true # instance variable definition
Tribble.count += 1 # class variable access
breed: -> new Tribble if @isAlive
die: ->
return unless @isAlive
Tribble.count -= 1
@isAlive = false
@count: 0 # class variable (property)
@makeTrouble: -> console.log ('Trouble!' for i in [1..@count]).join(' ')
This code would be about twice as many lines in JavaScript, so the compression is pretty great and the code is much cleaner and easier to understand. Burnham proclaims these virtues of CoffeeScript early on in the book:Shorter code is easier to read, easier to write, and, perhaps most critically, easier to change. Gigantic heaps of code tend to lumber along, as any significant modifications require a Herculean effort. But bite-sized pieces of code can be revamped in a few swift keystrokes, encouraging a more agile, iterative development style.Maybe that's stated a bit more strongly than is warranted, but it's still hard to argue with the improved simplicity and cleanliness of CoffeeScript making developers' lives more pleasant.
The last three chapters of the book delve into different frameworks and packages in the JavaScript universe that can be used with CoffeeScript, and the vehicle for exploring these things is a (heavily) stripped down version of the Trello app. Chapter 5 goes through how to create the front-end portion of the app with jQuery and Backbone.js. Chapter 6 adds a backend server for the app with Node and Express. Chapter 7 explores how to test the app with Intern. All of the code for the front-end, backend, and tests is written in CoffeeScript, and the transpiling is setup to be managed with Grunt. It's nice to see multiple different examples of how to use CoffeeScript anywhere that JavaScript would normally be used, just to get an idea of how to transition to CoffeeScript in multiple ways.
Throughout the book, Burnham presents everything in a straightforward, no-frills manner. Everything is clear and logical, and his concise descriptions are part of the reason the book is so short. He assumes you already know JavaScript—which is much appreciated—and he doesn't go into extended explanations of JavaScripts features. It's just the facts on how CoffeeScript is different and what the syntax is for the features it compresses. It's awfully hard for me not to recommend this book simply because it's so short and to the point. It only took a few hours to read through, and now I know a better way to code JavaScript. There's not much more I can ask of a programming language book.
Simplifying JavaScript
Every language has those more advanced books that assume you already know the language and instead of covering the basics and syntax, it provides advice on how to write idiomatically in the language. I've read these books for C++, Ruby, and JavaScript and found them to be surprisingly enjoyable to read. That was not the case with this book, but before I get too far into criticisms, I should summarize what this book does well.
Simplifying JavaScript is organized into ten chapters with each chapter broken into a set of tips that total 51 tips in all. These tips each explain one new feature of the JavaScript language from the new ES5, ES6, and ES2017 specifications. Some features, like the spread operator take multiple tips to fully cover. Then, the last chapter covers some features of the JavaScript development environment, like npm, that are not part of the language and have been around a bit longer than these newer specifications.
Most of the new features significantly improve and simplify the language, and they include things like:
- new variable declaration keywords const and let
- string template literals, which look much like Ruby's string interpolation
- the spread operator ... for converting arrays to lists and converting lists of parameters to arrays
- the Map object
- the Set object
- new loop iterators such as map(), filter(), and reduce()
- default parameters
- object destructuring
- unnamed arrow functions
- partially applied functions and currying
- classes
- promises and async/await
Morgan does a nice job introducing and justifying the new features at times:
We spend so much time thinking and teaching complex concepts, but something as simple as variable declaration will affect your life and the lives of other developers in a much more significant way.This is so true. The code we're reading and writing every day has hundreds of variable declarations and usages, and being able to indicate intent in those declarations makes code much cleaner and more understandable. Getting better at the fundamentals of the language and having these new declarations available so that the most common code is clear and purposeful will more significantly improve code than all of the complicated, esoteric features that only get used once in a blue moon.
These exciting new features and simple explanations were the good parts, so why did I end up not liking this book much? Mostly, it was because of how long-winded the explanations were. Each tip dragged on for what felt like twice as long as it needed to, and the book could have easily been half as long. CoffeeScript showed how to present language features in a clear, concise way. This book took the opposite approach. Then, to make matters worse, it was written in the second person with the author always referring directly to the reader with you this and you that. Normally I don't mind a few references to you, the reader, every now and then, but this was constant so it became constantly aggravating.
Beyond the writing style, some of the justifications for various features didn't hold much water. For example, when trying to rationalize the new variable declarations, Morgan presented an example of code where the variables are declared at the top, and then there are a hundred lines of code before those variables are used again. Then he says, "Ignore the fact that a block of code shouldn't be 100 lines long; you have a large amount of code where lots of changes are occurring." I don't know about you, but I wouldn't declare a variable and then not use it for a hundred lines. I would declare it right before use. He shouldn't have to contrive a bad example like that to justify the new const and let declarations. The improved ability to relate intent in the code should be reason enough.
In another example for why one must be careful when testing for truthy values in a conditional, he shows some code that would fail because a value of 0 is falsey:
const sections = ['shipping'];
function displayShipping(sections) {
if (sections.indexOf('shipping')) {
return true;
} else {
return false;
}
}
Ignoring the fact that I just cringe at code like this that returns a boolean value that should be computed directly instead of selected through an if statement, (don't worry, he corrects that later) there is much more wrong with this code than just the fact that an index of 0 will incorrectly hit the else branch. In fact, that is the only case that hits the else branch. Whenever 'shipping' is missing from sections, indexOf() will return -1, which is truthy! This code is just totally broken, even for an example that's supposed to show a certain kind of bug, which it does almost by accident.Other explanations were somewhat lacking in clarity. Late in the book, when things start to get complicated with promises, the explanations seem to get much more brief and gloss over how promises actually work mechanically and how the code executes. After having things explained in excruciating detail and in overly simplistic terms, I was surprised at how little explanation was given for promises. A step-by-step walk through of how the code runs when a promise executes would have been quite helpful in understanding that feature better. I figured it out, but through no fault of the book.
Overall, it was a disappointing read, and didn't at all live up to my expectations built up from similar books. The tone of the book was meant more for a beginner while the content was geared toward an intermediate to expert programmer. While learning about the new features of JavaScript was great, and there are plenty of new features to get excited about, there must be a better way to learn about them. At least it was a quick read, and refreshing my memory will be easy by skimming the titles of the tips. I wouldn't recommend Simplifying JavaScript to anyone looking to come up to speed on modern JavaScript. There are better options out there.
Subscribe to:
Posts (Atom)